我对gdb和调试共享对象的经验有限,所以我想知道是否有人可以阐明我所看到的行为。
基本上,我试图理解文档记录不佳的库的内部。为此,我编写了一个程序,使该库的使用率降到最低,并且我试图逐步查看它的运行情况。
问题在于,在gdb中多次使用“ step”命令后,程序会执行多个指令。我认为这是因为最终gdb指示启动了三个线程,但是我没有在代码中的任何地方看到为什么会发生这种情况的原因之一。
过去,我曾尝试用调试符号重建库,但这似乎并没有给我带来任何帮助。我什至不确定这是否相关,因为我认为gbd仍然可以单步执行没有调试符号的指令(即使没有调试符号也意味着它给我的信息更少)。
在相关的情况下:我正在调试我编写的3行程序,该程序与目标库进行动态链接。我有该库的源代码,但是它很复杂,所以我希望gdb可以使您有所了解。
提前谢谢!
答案 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指令,因为未使用任何参数 也不需要。同样,寄存器的值也保存到 堆栈变量作为参数复制到堆栈变量上。