2012-10-24 35 views
0

問題是與調試代碼,有一些DLL函數的調用,這一個和其他人相同的dll:GDB不能`next`在一個非系統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 <[email protected]>: 0x1000e620 

難怪,如果我鍵入next我再次得到:

​​

這是怎麼回事?

回答

2

next步驟,以便在源線 - 你需要的,如果你想要做的源代碼行步進你調試的dll的調試信息。在這種情況下,沒有調試信息可用,並且gdb不知道源行的起始/結束位置--不會執行任何操作。

相反,你需要通過這些程序使用的指令級步進命令,nextistepinisi)單指令一步。您也可以使用finish返回到呼叫者功能。

當人們在這個級別上使用gdb進行調試時,他們通常會在接下來的幾步中顯示下一條指令 - 執行disp/3i $pc以顯示接下來的三條指令。