我有一个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有点烦人。
答案 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每次程序停止时都会自动显示下一条要执行的指令。请参见自动显示。
参数是重复计数,如步骤。