gdb不能在非系统dll函数调用上“下一步”

时间:2012-10-24 09:34:45

标签: dll gdb cygwin

问题在于调试代码调用了一些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

发生了什么事?

1 个答案:

答案 0 :(得分:2)

next跨越源代码行 - 如果要进行源代码行步进,则需要调试dll的调试信息。在这种情况下,没有可用的调试信息,并且gdb不知道源行开始/结束的位置 - next将不会执行任何操作。

相反,您需要使用指令级步骤命令nextistepinisi)来执行这些例程的单个指令步骤。您还可以使用finish返回调用者函数。

当人们在此级别使用gdb进行调试时,他们通常会让gdb在步骤中显示下几条指令 - 执行disp/3i $pc以显示下三条指令。