0

问题在于调试代码调用了某个 dll 函数,这个函数和其他函数来自同一个 dll:

EdsGetCameraList(&l);

当我打破这一行然后发出next命令时,我得到一个

(gdb) n
0x1000e620 in ?? ()

0x1000e620是 EdsGetCameraList 的地址:

(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) 来单步执行这些例程。您也可以使用finish返回调用者函数。

当人们在这个级别使用 gdb 进行调试时,他们通常让 gdb 在他们执行步骤时显示接下来的几条指令——这样做是disp/3i $pc为了显示接下来的三个指令。

于 2012-11-18T23:52:02.090 回答