调试seg错误(无法修改源代码或makefile)

时间:2016-04-28 15:56:29

标签: c segmentation-fault gdb strace

我正在尝试在研究代码中调试C中的seg错误。我无法修改源代码/ makefile。由于我无法修改makefile(即重新编译程序)并且可执行文件未使用-g选项编译,我假设将gdb调试出窗口?或者有没有办法使用gdb而不使用-g?

编译可执行文件

我可以请求更改源代码,但我几乎可以肯定seg错误是由于我的一个输入文件,因此它不应该是源代码问题。

有人建议我使用“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

任何想法意味着什么?或者有关如何调试的任何建议?

2 个答案:

答案 0 :(得分:0)

" ...但我几乎可以肯定seg错误是由我的一个输入文件引起的"

然后你的调试应该集中在输入文件上。是否有输入规范?

如果您有许多输入文件并且手动检查文件是不可行的,您可以在C中编写一个验证器,它会检查所有输入文件的格式是否正确并报告错误。通过这些经过验证的文件,相关程序不再崩溃(希望如此)。

(编辑)

至于输入的调试,尝试一个最小的输入并展开,直到你完成输入。在某个地方会发生崩溃,可能会给你一个指示。

答案 1 :(得分:0)

  

我认为抛出gdb调试窗口?
  我几乎可以肯定seg错误是由我的一个输入文件引起的,所以它不应该是源代码问题。

你正在做出很多无根据的假设。

  1. #ifndef TRIDIALOG_H #define TRIDIALOG_H #include <QDialog> #include "secdialog.h" namespace Ui { class TriDialog; } class TriDialog : public QDialog { Q_OBJECT public: explicit TriDialog(QWidget *parent = 0); ~TriDialog(); private slots: void on_pushButton_5_clicked(); private: Ui::TriDialog *ui; TriDialog *triDialog; }; #endif // TRIDIALOG_H 总是源代码问题:无效输入应该产生错误,而不是崩溃。
  2. 您显示的SIGSEGV输出包含文件和行信息,通常表示该程序实际上是使用strace编译的。
  3. GDB完全能够调试在没有-g的情况下编译的程序,但它需要熟练的操作员。
  4. 程序似乎会自我报告某种错误。遗憾的是,您已删除该错误的所有相关部分,并仅显示堆栈跟踪(如果没有较早的输出,则不显示任何内容)。
  5. 应该做什么:

    1. 不要做出无根据的假设和猜测。
    2. 编辑您的问题(或开始一个新问题),显示程序实际报告的错误。
    3. 在GDB下运行程序,并观察您实际上可以看到文件/行信息,以及可能的参数和局部变量值。
    4. 阅读源代码,了解它可能崩溃的原因和原因,在崩溃时检查变量,了解原因(即实际调试问题)。