调试用 yasm 创建的汇编代码

Posted

技术标签:

【中文标题】调试用 yasm 创建的汇编代码【英文标题】:Debugging assembly code created with yasm 【发布时间】:2012-04-29 11:58:51 【问题描述】:

我需要一些帮助来寻找和使用一个好的调试器,用于在 64 位 Linux 上用 yasm 组装的 asm 代码。 gdb 调试器一直抱怨没有加载符号表。 *** 上的某个人建议使用 -dstabs 开关进行组装,但这对我来说没有什么区别。 ddd 也没有什么不同。

如果我能找到摆脱“未加载符号表”问题的方法,gdb 就不会那么糟糕了。我还需要能够查看寄存器和其他声明的内容。

我使用yasm -f elf -m amd64 file.asm 组装我的asm 文件并与ld file.o -o file 链接。使用 -l 开关使用 yasm 创建 .lst 文件似乎也不起作用。

我发现的关于这个问题的所有建议似乎都与使用 gcc 作为链接器而不是 ld 有关。我需要能够与 ld 关联。

【问题讨论】:

您在组装时是否尝试过使用-g 选项? @Job:谢谢!我认为它奏效了。我从 gdb 获得了一些新信息。对我有用的是命令:yasm -f elf -m amd64 -g stabs file.asm。 gdb_dbgfmts 的手册页建议 stabs 是适用于 UNIX 操作系统的调试格式,但我并不真正了解调试格式。有更好的选择吗? 我建议使用 dwarf,看我的回答。 【参考方案1】:

您应该将-g 选项用于yasm。我建议使用dwarf2 格式,因为这似乎是当今的标准。

yasm -f elf -m amd64 -g dwarf2 file.asm

【讨论】:

感谢 dwarf2 的建议。它似乎解决了我在 gdb 中 step 时跳过多行的问题。【参考方案2】:

我目前正在学习系统编程,我们使用ddd 进行调试,使用-g dwarf2 标志。到目前为止效果很好。

【讨论】:

ddd 只是 gdb 的 GUI 前端。 我知道...他说他想“查看寄存器和其他声明的内容”。也许您更喜欢必须在命令行中打印出变量和寄存器值的光荣混乱,但我发现为所有这些信息提供一个漂亮的小单独显示也很有帮助。 Gdb 是一个很好的调试器。他征求意见,我给了一个。请随时提出更好的建议,我总是乐于改进。

以上是关于调试用 yasm 创建的汇编代码的主要内容,如果未能解决你的问题,请参考以下文章

win7的操作系统打不开汇编编译器(yasm&nasm)

无法使 libtool 合并 yasm 创建的目标文件

ARM汇编基础基于Keil创建STM32汇编程序的编写

gdb调试中怎么查看其中一行的汇编代码

64位的汇编怎么搞

vs2017 自定义生成规则 错误 MSB3721 命令 ”已退出,返回代码为 1。