如何在c ++编译程序中找到导致分段错误的行
How to find the line caused segmentation fault in c++ compiled program
我正在使用 vim
进行 C++ 编程。我已将编译命令绑定到 vim 中的 ctrl+c
,并通过 运行ning ./main.out
在另一个 tmux
窗格中将其 运行。我的问题是,当我的 C++ 程序给我 segmentation fault
错误时,我不知道是哪一行导致了问题。但是当我编译 运行 vscode
中的程序时,它向我显示了导致错误的行。
我正在寻找一种方法来找出导致 运行time 错误的行,例如 segmentation fault
错误,同时 运行 在控制台中设置程序的二进制文件。
这是我执行 ./main.out
:
时的示例输出
[1] 24656 segmentation fault (core dumped) ./main.out
编译程序时,添加 -g
编译器标志,或者更好的是 -ggdb3
,通过向可执行文件添加调试符号,这将为您提供更漂亮的输出。另外,请确保使用 -O0
优化级别进行编译。
实际调试程序,运行 gdb ./main.out
在调试会话中启动程序。如果你然后 运行 r
,gdb 将开始执行程序,然后在出现段错误的行处停止。
要弄清楚如何你到达那个点,运行 bt
在调试会话中,你会得到一个回溯,它将显示为到达崩溃的代码行而进行的所有函数调用。
您当然可以做的远不止这些(您可能需要这样做,因为定位错误源通常只是第一步)。您可以使用 p
来打印变量的值、设置观察点以及更多其他内容。一段时间以来,gdb 甚至附带了一个完整的 python 解释器,因此您甚至可以编写一个 python 脚本来满足您的自定义调试需求。
一开始学习如何使用 gdb 似乎让人不知所措,但要坚持下去,我保证付出的努力会有丰厚的回报:)
阿丁同上
此外,您的代码可能会由于 parameter/s 可接受的调用而崩溃,但如果您没有这些调试版本,则会导致某处某个库出现众所周知的超出范围保护错误。如果在那里使用汇编例程,他们可以做一些奇怪的事情。
所以不要害怕添加临时代码来帮助找到一个崩溃的调用,而其他 1,000,000 个相同的调用却没有。
这就是为什么我喜欢尽可能使用大量生成的随机数来测试你何时修复它。
我正在使用 vim
进行 C++ 编程。我已将编译命令绑定到 vim 中的 ctrl+c
,并通过 运行ning ./main.out
在另一个 tmux
窗格中将其 运行。我的问题是,当我的 C++ 程序给我 segmentation fault
错误时,我不知道是哪一行导致了问题。但是当我编译 运行 vscode
中的程序时,它向我显示了导致错误的行。
我正在寻找一种方法来找出导致 运行time 错误的行,例如 segmentation fault
错误,同时 运行 在控制台中设置程序的二进制文件。
这是我执行 ./main.out
:
[1] 24656 segmentation fault (core dumped) ./main.out
编译程序时,添加 -g
编译器标志,或者更好的是 -ggdb3
,通过向可执行文件添加调试符号,这将为您提供更漂亮的输出。另外,请确保使用 -O0
优化级别进行编译。
实际调试程序,运行 gdb ./main.out
在调试会话中启动程序。如果你然后 运行 r
,gdb 将开始执行程序,然后在出现段错误的行处停止。
要弄清楚如何你到达那个点,运行 bt
在调试会话中,你会得到一个回溯,它将显示为到达崩溃的代码行而进行的所有函数调用。
您当然可以做的远不止这些(您可能需要这样做,因为定位错误源通常只是第一步)。您可以使用 p
来打印变量的值、设置观察点以及更多其他内容。一段时间以来,gdb 甚至附带了一个完整的 python 解释器,因此您甚至可以编写一个 python 脚本来满足您的自定义调试需求。
一开始学习如何使用 gdb 似乎让人不知所措,但要坚持下去,我保证付出的努力会有丰厚的回报:)
阿丁同上 此外,您的代码可能会由于 parameter/s 可接受的调用而崩溃,但如果您没有这些调试版本,则会导致某处某个库出现众所周知的超出范围保护错误。如果在那里使用汇编例程,他们可以做一些奇怪的事情。 所以不要害怕添加临时代码来帮助找到一个崩溃的调用,而其他 1,000,000 个相同的调用却没有。 这就是为什么我喜欢尽可能使用大量生成的随机数来测试你何时修复它。