gdbでのDLLのデバッグ

Pocket

MinGWで、dllのデバッグをしようとすると、ブレークポイントを設定するのにちょっとしたコツが必要になります。
具体的には、QEMUでSDL.dllのデバッグをしようとしたのですが、まず、-gオプション付でSDLのコンパイルをします。
SDL-1.2.11>$ CFLAGS="-O0 -g" configure
SDL.dllをQEMUのある場所にコピーします。そして、gdbでのデバッグを開始します。
ここで、QEMUを走らせてからDLL内の関数を指定する方法と、走らせる前に指定する方法の2つがあります。
[その1]QEMUを走らせてから設定
いったんmain関数で実行を止めて、ブレークポイントを設定します。
$ gdb qemu
(gdb) set args -L ../pc-bios -hda ../../linux.img
(gdb) b main
(gdb) run
止まったら、調べたい関数を指定します。
(gdb) b SDL_VideoInit
(gdb) continue
これで、DLL内で止まると思います。
[その2]QEMUを走らせる前に設定
dll-symbolsでSDL.dllを指定します。
$ gdb qemu
(gdb) set args -L ../pc-bios -hda ../../linux.img
(gdb) dll-symbols SDL.dll
listで調べたい関数を表示します。
(gdb) list SDL_VideoInit
141
142 /*
143 * Initialize the video and event subsystems -- determine native pixel format
144 */
145 int SDL_VideoInit (const char *driver_name, Uint32 flags)
146 {
147 SDL_VideoDevice *video;
148 int index;
149 int i;
150 SDL_PixelFormat vformat;
表示された行番号をブレークポイントに指定します。
(gdb) break 145
(gdb) run
これで、runをすればブレークポイントで止まるはずです。ソースコードが表示されない場合、directoryでソースコードの位置を指定する必要があるかもしれません。
(gdb) directory ~/sdl-1.2.11/src/video/
なぜQEMUを実行してからでないと、ブレークポイントを設定できないかというと、SDL.dllがメモリーにロードされないとアドレスが解決できないせいだと思います。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください