gdb正在跳过说明

时间:2019-01-15 20:55:34

标签: c++ gdb shared-objects

我对gdb和调试共享对象的经验有限,所以我想知道是否有人可以阐明我所看到的行为。

基本上,我试图理解文档记录不佳的库的内部。为此,我编写了一个程序,使该库的使用率降到最低,并且我试图逐步查看它的运行情况。

问题在于,在gdb中多次使用“ step”命令后,程序会执行多个指令。我认为这是因为最终gdb指示启动了三个线程,但是我没有在代码中的任何地方看到为什么会发生这种情况的原因之一。

过去,我曾尝试用调试符号重建库,但这似乎并没有给我带来任何帮助。我什至不确定这是否相关,因为我认为gbd仍然可以单步执行没有调试符号的指令(即使没有调试符号也意味着它给我的信息更少)。

在相关的情况下:我正在调试我编写的3行程序,该程序与目标库进行动态链接。我有该库的源代码,但是它很复杂,所以我希望gdb可以使您有所了解。

提前谢谢!

2 个答案:

答案 0 :(得分:0)

  

我认为gbd仍然可以按照说明进行操作

可以,但是命令是stepi,而不是您正在使用的step

逐步浏览,这需要在源代码中提供调试信息。

答案 1 :(得分:0)

  

有关优化的一些信息

例如,这是一个C代码:

int main(int argc, char** argv) {
  printf("Hello World\n");
  return 0;
}

使用-O0进行构建时,几乎不会完成代码优化,并且代码运行非常缓慢。这是未优化的代码(gcc -m32):

; Variables:
        ;    arg_4: 12
        ;    arg_0: 8
        ;    var_4: -4
        ;    var_8: -8
        ;    var_C: -12
        ;    var_10: -16
        ;    var_18: -24
push       ebp
mov        ebp, esp
sub        esp, 0x18
call       _main+11
pop        eax                            ; CODE XREF=_main+6

-- These lines are gone after optimization --
mov        ecx, dword [ebp+arg_4]
mov        edx, dword [ebp+arg_0]
--                                    --
lea        eax, dword [eax-0x1f5b+0x1fa6] ; "Hello World!\\n"

-- There lines are gone after optimization --
mov        dword [ebp+var_4], 0x0
mov        dword [ebp+var_8], edx
mov        dword [ebp+var_C], ecx

mov        dword [esp+0x18+var_18], eax  ; method imp___symbol_stub__printf
call       imp___symbol_stub__printf
xor        ecx, ecx                           
mov        dword [ebp+var_10], eax
mov        eax, ecx                                    
add        esp, 0x18                           
pop        ebp
ret

使用-03进行构建时,您会发现行数减少了。优化的代码(gcc -m32 -O3):

push       ebp
mov        ebp, esp
sub        esp, 0x8
call       _main+11
pop        eax                             ; CODE XREF=_main+6
lea        eax, dword [eax-0x1f6b+0x1f9e]  ; "Hello World!"
mov        dword [esp+0x8+var_8], eax      ; "%s" for imp___symbol_stub__puts
call       imp___symbol_stub__puts
xor        eax, eax
add        esp, 0x8
pop        eep
ret
  

未优化的代码具有不必要的行的原因是因为   main接受两个参数,并将它们保存到寄存器中,无论您是否   使用或不使用未经优化,但经过优化的编译器   删除这些mov指令,因为未使用任何参数   也不需要。同样,寄存器的值也保存到   堆栈变量作为参数复制到堆栈变量上。