前提・実現したいこと
GDBを使ったデバッグで表示されたメッセージの意味を読み解きたいです。
別件のデバッグで、warning: HEAP・・・を受け、その表示されたアドレスに関して理解できない部分がありました。
問題を整理するため、ヒープメモリを意図的に破壊して同様の結果を得るテストプログラムを作成、実行しましたがやはりよくわかりません。
具体的には、下の例でいうと Heap block at 003311B8 の部分の数値が何なのか、この値からどのように情報を引き出せばいいのかご教授いただければと思います。
発生している問題・エラーメッセージ
warning: HEAP[HeapChek2.exe]: warning: Heap block at 003311B8 modified at 00331288 past requested size of c8
該当のソースコード
C
1 2#include <stdio.h> 3#include <tchar.h> 4#include <stdlib.h> 5#include <malloc.h> 6#include <locale.h> 7//意図的にヒープ破壊を起こして、デバッグ情報を得る練習 8int main(int argc, char **argv){ 9 10 int size, len, i; 11 TCHAR *p=NULL; 12 13 if( argc==0 || argv==NULL ) return 1; 14 15 setlocale( LC_ALL, "Japanese" );//ロケール(地域言語)を日本語でセット 16 len = 100; 17 size = len*sizeof(TCHAR); 18 19 p = malloc( size ); 20 _tcsncpy(p, _T("BCDE"), len ); 21 22 _tprintf( _T("%s@\n"), p ); 23 _tprintf( _T("p=%d\n"), p ); 24 25 for(i=0;i<5;i++){ 26 _tprintf( _T("&(p[%d]) =%d %x 「%c」\n"), i, &(p[i]), &(p[i]), p[i] ); 27 } 28 _tprintf( _T("&(p[99]) =%d %x\n"), &(p[99]), &(p[99]) ); 29 _tprintf( _T("&(p[100])=%d %x\n"), &(p[100]), &(p[100]) ); 30 31 //ヒープで確保した領域外破壊箇所 32 p[len] = 0; 33 34 free( p ); 35 36 _tprintf( _T("無事終了\n") ); 37 38 return 0; 39} 40
試したこと
GDBからはwarning: Heap block at 003311B8 modified at 00331288 past requested size of c8
というメッセージを受け取っています。
これは、
003311B8に確保したヒープメモリはc8(10進数で100)要素しか要求してないのに、お前はそれを超えた00331288にアクセスしておる。
という意味だと解釈しています。
ところが、この003311B8は実際にmallocから受け取ったアドレスからはかなり後方にあり、このメッセージからはmallocの返り値を推定することは難しいと思います。
](3705e0b23795fe495a59862351bb7a35.png)
逆算してみると、警告メッセージの003311B8はp[-4]に当たる場所です。
今回は意図的にp[100]=0;で破壊していますので破壊されるヒープのポインタpの位置は自明ですが、できれば警告メッセージからp[0]の位置を知りたいと思います。
そもそも、警告メッセージの「Heap block at 003311B8」の意味を勘違いしているのかもしれませんが、今のところなぜこんな後方のアドレスを教えてくるのかわかりません。
GDBに詳しいわけではないので、割と当たり前のことも知らないのかもしれません。解決に役立ちそうなGDBコマンドや本来のアドレスの推測法など、情報がありましたらご指導いただければと思います。
補足情報(FW/ツールのバージョンなど)
Win7 32bit
CPUはIntel Core(TM)2 Duo CPU P8700 2.53GHz、多分リトルエンディアンです。
Mingw gcc version 8.2.0 (MinGW.org GCC-8.2.0-3)
GNU gdb (GDB) 7.6.1
コンパイルコマンドは
gcc -std=gnu99 -DUNICODE -D_UNICODE -Ddebug -g3 -O0 -static -Wextra -Wshadow -W
strict-prototypes -Wmissing-declarations -Winit-self -Wswitch-default -Wswitch-e
num -Wfloat-equal -Wcast-align -Wsign-compare -ftrapv -Wall -Wuninitialized -s -
c -o HeapChek2.obj HeapChek2.c
gcc -std=gnu99 -g3 -static -ftrapv -o HeapChek2.exe HeapChek2.obj
でコンパイルとリンクをしています。
GDBでは以下の出力を得ております。
(gdb) run
Starting program: HeapChek2.exe
[New Thread 5564.0xd18]
BCDE@
p=3346880
&(p[0]) =3346880 3311c0 「B」
&(p[1]) =3346882 3311c2 「C」
&(p[2]) =3346884 3311c4 「D」
&(p[3]) =3346886 3311c6 「E」
&(p[4]) =3346888 3311c8 「」
&(p[99]) =3347078 331286
&(p[100])=3347080 331288
warning: HEAP[HeapChek2.exe]:
warning: Heap block at 003311B8 modified at 00331288 past requested size of c8
Program received signal SIGTRAP, Trace/breakpoint trap.
0x77525a1d in ntdll!RtlpNtMakeTemporaryKey ()
from C:\Windows\system32\ntdll.dll
(gdb) x 0x3311c0
0x3311c0: 0x00430042
(gdb) x 0x3311c2
0x3311c2: 0x00440043
(gdb) x 0x3311c4
0x3311c4: 0x00450044
(gdb) x 0x3311be
0x3311be: 0x00421800
どうかよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/26 11:37