如何获取堆栈跟踪信息?

3
我正在使用epoll在linux机器上进行服务器编程,但我遇到了调试问题。目前,我已经在各个地方放置了日志语句。这有助于看到它何时崩溃,但很难看出为什么会崩溃。
所以,我想知道是否有一种方法可以在C++中打印堆栈跟踪或更多信息。
提前感谢...
编辑:
我在makefile中设置了-g选项,如果我在GDB上运行我的服务器,则不会接收任何数据包。我不知道为什么,但如果我在命令行上运行它,那么它就可以接收数据包,但如果我在GDB上运行它,则无法从客户端接收任何内容(我看不到任何日志语句)。

1
我认为你需要一个调试器。由于你在Linux上,可能需要使用GDB。 - Tim
尝试在gdb下运行您的程序。它有一个名为bt的命令,可以实现您想要的功能。 - beduin
如果“blows up”指的是崩溃(比如sigsegv),那么你可以编译程序时加入调试信息,启用核心转储,然后使用gdb来分析核心转储。核心转储应该会告诉你程序崩溃的位置。 - rve
请问您可以分享一下在gdb中启动您的应用程序所遵循的步骤吗? 过去我曾经使用gdb来调试我的应用程序,没有发现任何问题。 - Vivek Goel
4个回答

3

1

你可以使用 gdb 调试器运行程序。

如果你正在使用 gcc,你需要使用 -g 或其他调试标志重新编译它。

这样你的可执行文件将包含更多关于你的程序的信息。


在我的 make 文件中,我设置了 CC:=g++ 和 CFLAGS:= -DDEBU1 -DCONFIG_EMBEDDED -DUSE_IND_THREAD -DFIXED。然后我把它们都放在了这里:$(CC) $(CFLAGS) -o server $(SOURCE) $(LIBS),那么我需要在 -o 后面添加 -g 吗?提前感谢您的回答。 - user800799
在启动gdb时,您可以设置断点,例如. 文件名:行号类名:函数名。使用break命令来设置断点。使用run命令启动应用程序,当其中一个断点被触发时,gdb会停止执行。然后,您可以使用bt命令查看回溯信息。 - Vivek Goel
你也可以使用print命令来查看变量。阅读GDB教程以获取更多信息。 - Vivek Goel

1
如果您的程序能够检测到崩溃时的情况,您可以编写一个脚本并在其上启动GDB。该脚本可以让GDB打印出回溯信息。
根据您想要的信息类型,查看/proc/<pid>/stack可能会有所帮助。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接