【发布时间】:2011-08-15 00:00:16
【问题描述】:
我在运行项目时遇到了段错误。每次我在 gdb 中运行程序时,段错误都会消失。这种行为不是随机的:每次我在我的 shell 中运行它时,它都会出现段错误,每次我在 gdb 中运行它时,段错误都会消失。 (我确实使用 -g 重新编译)。
所以在我开始疯狂地在代码中到处添加 printfs 之前,我想知道一些事情:
- 这种行为常见吗?
- 解决问题的最佳方法是什么?
我不知道是否可以编写测试脚本,因为我的应用程序是交互式的,并且在特定用户输入时崩溃。
我没有在这里粘贴我的代码,因为它太长了。但如果有人有兴趣帮忙,这里是: https://github.com/rahmu/Agros
【问题讨论】:
-
尝试在
valgrind中运行您的应用(如果您的平台上可用)。 -
在使用
-g编译但不在 GDB 中运行时,您的程序是否在没有段错误的情况下运行? -
欢迎来到海森堡的奇妙世界。你有valgrind吗?如果是这样,请使用它。您是否至少使用“
gcc -g -Wall -Werror”进行编译?如果没有,请让您的代码达到您可以做到的程度。考虑将“-Wextra”添加到该命令行。你有核心转储吗?如果没有,请重新启用它们 (ulimit -c unlimited) 并至少让 gdb 告诉您崩溃发生的位置。 -
尝试使用
-Wextra -pedantic和-Wall/-Wextra进行编译,它可能会有所收获。如果您无法设置自己以获取核心转储(如果默认情况下没有获得它们,请使用ulimit -c <size>- 无论如何在 ubuntu 上)并使用gdb myprogram mycore将其加载到 gdb 中。