使用命令“s”时Gdb不会执行功能

时间:2018-06-12 17:55:25

标签: c linux macos debugging gdb

我有一个gdb的问题,当我使用“s”进入从main调用的函数时,gdb会跳转到另一个函数而不显示我需要的函数。 为了清楚起见,我在这里使用步骤:

在main.c中

short c= get(a,b);

现在得到一个36行代码,在第27行它调用另一个函数“swap”:

在get.s

call _swap;

当我在“get”上使用带有gdb的步骤时,它会跳转所有的get函数,并显示_swap函数。 这些是3个不同的文件:main.c get.s swap.c以这种方式编译:

gcc -g -m32 main.c swap.c get.s -o IA-main

-m32因为get.s是程序集IA-32。问题是:“为什么它跳”获得“功能,它只显示”_swap“?

我可以在必要时发布代码。我在Mac OS Sierra 10.12.6上工作,所以gdb有点烦人。

1 个答案:

答案 0 :(得分:0)

来自http://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html(强调我的)

  

步骤

     

继续运行程序,直到控件到达不同的源代码行,然后停止它并将控制权返回给GDB。该命令缩写为s。

     

警告:如果在控件位于没有调试信息的情况下编译的函数中使用step命令,则执行将继续执行,直到控件到达具有调试信息的函数。同样,它不会执行编译成没有调试信息的函数。 要在没有调试信息的情况下逐步执行功能,请使用下面描述的stepi命令

您可以改为使用stepi命令:

  

步骤1

     

stepi arg

     

SI

     

执行一条机器指令,然后停止并返回调试器。

     

按照机器指令进行'display / i $ pc'通常很有用。这使得GDB每次程序停止时都会自动显示下一条要执行的指令。请参见自动显示。

     

参数是重复计数,如步骤。