Debugging 如何调试汇编程序?

Debugging 如何调试汇编程序?,debugging,gdb,segmentation-fault,nasm,Debugging,Gdb,Segmentation Fault,Nasm,我有一个用汇编语言编写的程序,由于分段错误而崩溃。(该代码与此无关,但不适用。) 我的问题是如何用GDB调试汇编语言程序 当我尝试在GDB中运行它并执行回溯跟踪时,我没有得到任何有意义的信息。(只是十六进制偏移。) 如何调试程序 (顺便说一句,我正在Ubuntu上使用NASM,如果有帮助的话。)我会直接将它加载到gdb中,然后一条一条地逐条检查它,在运行过程中监视所有寄存器和内存内容 我肯定我不会告诉你任何你不知道的事情,但是这个程序看起来很简单,足以证明这种方法是正确的。对于更复杂的代码,我会

我有一个用汇编语言编写的程序,由于分段错误而崩溃。(该代码与此无关,但不适用。)

我的问题是如何用GDB调试汇编语言程序

当我尝试在GDB中运行它并执行回溯跟踪时,我没有得到任何有意义的信息。(只是十六进制偏移。)

如何调试程序


(顺便说一句,我正在Ubuntu上使用NASM,如果有帮助的话。)

我会直接将它加载到
gdb
中,然后一条一条地逐条检查它,在运行过程中监视所有寄存器和内存内容

我肯定我不会告诉你任何你不知道的事情,但是这个程序看起来很简单,足以证明这种方法是正确的。对于更复杂的代码,我会留下一些奇特的调试技巧,比如回溯(甚至断点)

关于具体问题(代码解释如下):

您似乎只是将5推到堆栈上,后跟内存中该5的地址(
v_0
)。我很确定,如果您想调用
printf
,您需要在某个时候推送格式字符串的地址。给它一个流氓格式的字符串是不可能的

很可能您的:

mov eax, v_0
应该是:

mov eax, format

我假设在调用
printf
之后会有更多的代码,而您只是将其忽略为不重要的代码(否则,当它返回时,您将永远不会着陆)。

在链接代码(使用gcc)时,您应该仍然能够使用Stabs标记进行组装

我建议使用
-dstabs
选项并与之组合:

$ yasm -felf64 -mamd64 -dstabs file.asm
这就是我组装汇编程序的方式

NASM和YASM代码在很大程度上是可交换的(YASM有一些在NASM中不可用的扩展,但每个NASM代码都与YASM很好地组合在一起)


< >我使用GCC将我的组合对象文件链接到一起,或者用C或C++代码编译。使用gcc时,我使用
-gstabs+
用调试标记编译它。

正是问题所在-我刚刚发现了!非常感谢。
$ yasm -felf64 -mamd64 -dstabs file.asm