如何调试程序集?

用户16011868

我有以下test要调试的程序集文件

我怎样才能做到这一点?

注意我正在使用 x86-64 和 att 语法,而且我无权访问 c 代码。我想在每一行之后停止并能够看到表中的寄存器(我记得有这样一个选项)。

我试过:

gdb test
r

但我得到:

Starting program:  
No executable file specified.
Use the "file" or "exec-file" command.
彼得·科德斯

可执行文件上运行 GDB 后1
使用startstarti分别在 main 或 _start 中设置断点并运行程序。

或者自己b 12设置断点以在源代码第 12 行上设置断点(如果您使用足够的调试信息进行构建以使其正常工作),或者b *0x00401007在您从disas输出中复制/粘贴的地址上设置断点

layout asm/layout reg将 GDB 置于终端中带有“windows”的文本 UI 模式以进行反汇编和注册。(这可能有点不稳定,您有时需要 control-L 来重绘屏幕,有时当您的进程退出时 GDB 会崩溃,尽管我不确定这是否来自 TUI。)
否则没有 TUI 模式,info reg并且disas可能很有用。

有关更多 asm 调试技巧,请参阅https://stackoverflow.com/tags/x86/info的底部

特别strace ./test是查看您的程序进行的系统调用,解码为 C 风格非常有用。在您为自己的实验而玩的玩具程序中,这基本上可以作为检查错误返回值的替代方法。


脚注 1:您没有正确执行该部分:

No executable file specified.

这意味着test您运行的目录中存在名为的文件gdb test

您必须将 + 链接组装test.S到一个可执行文件中,test然后才能在该文件上运行 GDB。如果ls -l test显示,则gdb test可以调试它。(并且./test可以运行它。)


通常gcc -no-pie foo.S是使调试更容易的好选择:地址将在链接时固定,因此objdump -drwC -Mintel test输出将与您在运行时看到的地址相匹配。并且地址在数字上会更小,因此更容易在视觉上发现代码(.text)地址与 .rodata(现代ld将其放在单独的页面中,因此可以避免 exec 权限)与 .data / .bss。

无论哪种方式,堆栈地址仍然很容易与代码区分开来,0x55​​5...或者0x0000...XXXXXX在可执行文件中,0x7fffff...在堆栈中,来自 mmap 的其他地址是随机的。(但 libc 也被映射到堆栈附近的高地址,无论有没有 PIE。)

(或者,如果您正在写作_start而不是main,gcc -nostdlib -static foo.S暗示-no-pie

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从 GAC 远程调试程序集

使用gdb调试程序集(NASM)

如何用无限循环调试程序?

在GDB中调试程序时如何获取程序环境

如何模拟时间流逝来调试程序?

用Valgrind调试程序

是否可以将调试程序集转换为发布程序集?

如何为Deep Link Android App触发调试程序附加调试器?

调试程序集时,如何在VS2019监视窗口中将内存地址转换为用户定义的类型?

调试程序时,UserControl的按钮消失

程序启动后,如何将Visual Studio设置为调试程序?

如何使用自定义的elf解释器调试程序?

如何安装必要的调试程序包以报告Kubuntu中的回溯?

如何调试ConfuserEx程序集?

是否可以在执行程序时调试程序?

VB6-调试程序以协助编译程序

IntelliJ。调试程序,即使它无法编译

我尝试调试程序时rascal冻结

在bash脚本中使用调试程序分离tmux会话

我可以在Verifone Verix OS中调试程序吗?

使用新建的编译器在Eclipse中调试程序

调试后台作业(一步)和调试程序有什么区别?

QXcbConnection:使用Qt5远程调试程序时,无法连接到显示器

gdb在调试程序行为wrt`accept()`和`close()`中有什么变化

Eclipse反汇编视图,不调试程序可以查看反汇编吗?

使用gdb在MS VC ++ 2010 Express中编译的调试程序

在执行过程中随时在Visual Studio 2013中调试程序

如何在程序集上运行调试器

我可以避免在调试器附带调试程序的情况下避免缓慢的.net异常?