问题在于调试代码调用了一些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
发生了什么事?
答案 0 :(得分:2)
next
跨越源代码行 - 如果要进行源代码行步进,则需要调试dll的调试信息。在这种情况下,没有可用的调试信息,并且gdb不知道源行开始/结束的位置 - next
将不会执行任何操作。
相反,您需要使用指令级步骤命令nexti
和stepi
(ni
,si
)来执行这些例程的单个指令步骤。您还可以使用finish
返回调用者函数。
当人们在此级别使用gdb进行调试时,他们通常会让gdb在步骤中显示下几条指令 - 执行disp/3i $pc
以显示下三条指令。