我正在尝试在研究代码中调试 C 中的段错误。我无法修改源代码/makefile。由于我无法修改 makefile(即重新编译程序)并且可执行文件不是使用 -g 选项编译的,因此我认为这会将 gdb 调试抛出窗口?或者有没有一种方法可以使用 gdb 而无需使用 -g 编译可执行文件?
我可以请求更改源代码,但我几乎可以肯定段错误是由于我的输入文件之一造成的,因此它不应该是源代码问题。
有人建议我使用“strace”,我对此不太熟悉。这是我对程序进行跟踪时的输出结尾:
close(27) = 0
munmap(0x2abe4843d000, 65536) = 0
write(2, "==== backtrace ====\n", 20==== backtrace ====
) = 20
write(2, " 2 0x00000000000597bc mxm_handle"..., 113 2 0x00000000000597bc mxm_handle_error() /var/tmp/OFED_topdir/BUILD/mxm-3.3.3055/src/mxm/util/debug/debug.c:641
) = 113
write(2, " 3 0x000000000005992c mxm_error_"..., 121 3 0x000000000005992c mxm_error_signal_handler() /var/tmp/OFED_topdir/BUILD/mxm-3.3.3055/src/mxm/util/debug/debug.c:616
) = 121
write(2, " 4 0x00000037ccc326a0 killpg() "..., 37 4 0x00000037ccc326a0 killpg() ??:0
) = 37
write(2, " 5 0x00000000004ec6ef interpLema"..., 99 5 0x00000000004ec6ef interpLemansToMopar_linear() /home/dzdang/w16/sources/mopar_bc_interp.c:559
) = 99
write(2, " 6 0x000000000040c4ee main() /h"..., 68 6 0x000000000040c4ee main() /home/dzdang/w16/sources/lemans.c:611
) = 68
write(2, " 7 0x00000037ccc1ed5d __libc_sta"..., 48 7 0x00000037ccc1ed5d __libc_start_main() ??:0
) = 48
write(2, " 8 0x0000000000403c99 _start() "..., 37 8 0x0000000000403c99 _start() ??:0
) = 37
write(2, "===================\n", 20===================
) = 20
brk(0x2958000) = 0x2958000
tgkill(15432, 15432, SIGSEGV) = 0
rt_sigreturn(0x3c48) = 46993935941696
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Segmentation fault
你知道这意味着什么吗?或者对如何调试有什么建议?
最佳答案
“...但我几乎可以肯定段错误是由于我的一个输入文件造成的”
那么你的调试应该集中在你的输入文件上。有输入规范吗?
如果您有许多输入文件并且手动检查文件是不可行的,您可以用 C 语言编写一个验证器来检查所有输入文件的格式是否正确并报告错误。有了这些经过验证的文件,相关程序就不会再崩溃(希望如此)。
(编辑)
对于输入的调试,尝试最小的输入并扩展它,直到获得完整的输入。某个地方会发生崩溃,这可能会给您一个指示。
关于c - 调试seg错误(无法修改源代码或makefile),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36919765/