0

問題は、いくつかのdll関数、これと同じdllからの他の関数を呼び出すデバッグコードにあります。

EdsGetCameraList(&l);

この行を中断してnextコマンドを発行すると、

(gdb) n
0x1000e620 in ?? ()

0x1000e620EdsGetCameraListのアドレスです:

(gdb) disas find_cam,+20
Dump of assembler code from 0x401783 to 0x401797:
   0x00401783 <find_cam+0>:     push   ebp
   0x00401784 <find_cam+1>:     mov    ebp,esp
   0x00401786 <find_cam+3>:     sub    esp,0x48
=> 0x00401789 <find_cam+6>:     lea    eax,[ebp-0x14]
   0x0040178c <find_cam+9>:     mov    DWORD PTR [esp],eax
   0x0040178f <find_cam+12>:    mov    eax,ds:0x4092dc
   0x00401794 <find_cam+17>:    call   eax
   0x00401796 <find_cam+19>:    sub    esp,0x4
End of assembler dump.
(gdb) x 0x4092dc
0x4092dc <_imp__EdsGetCameraList@4>:    0x1000e620

nextもう一度入力しても不思議ではありません。

(gdb) n
Cannot find bounds of current function

何が起こっている?

4

1 に答える 1

2

nextソース行のステップオーバー-ソース行のステップ実行を行う場合は、デバッグしている dll のデバッグ情報が必要です。この場合、利用可能なデバッグ情報はなく、gdb はソース行の開始/終了場所を認識できnextず、何もしません。

代わりに、命令レベルのステップ コマンドnextistepi( ni, si) を使用して、これらのルーチンを 1 つの命令でステップ実行する必要があります。finish呼び出し元の関数に戻るために使用することもできます。

このレベルで gdb を使用してデバッグする場合、多くの場合、gdb はステップ実行時に次のいくつかの命令を表示しdisp/3i $pcます。次の 3 つの命令を表示するために実行します。

于 2012-11-18T23:52:02.090 に答える