我正在尝试在研究代码中调试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
任何想法意味着什么?或者有关如何调试的任何建议?
答案 0 :(得分:0)
" ...但我几乎可以肯定seg错误是由我的一个输入文件引起的"
然后你的调试应该集中在输入文件上。是否有输入规范?
如果您有许多输入文件并且手动检查文件是不可行的,您可以在C中编写一个验证器,它会检查所有输入文件的格式是否正确并报告错误。通过这些经过验证的文件,相关程序不再崩溃(希望如此)。
(编辑)
至于输入的调试,尝试一个最小的输入并展开,直到你完成输入。在某个地方会发生崩溃,可能会给你一个指示。
答案 1 :(得分:0)
我认为抛出gdb调试窗口?
我几乎可以肯定seg错误是由我的一个输入文件引起的,所以它不应该是源代码问题。
你正在做出很多无根据的假设。
#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
总是源代码问题:无效输入应该产生错误,而不是崩溃。SIGSEGV
输出包含文件和行信息,通常表示该程序实际上是使用strace
编译的。-g
的情况下编译的程序,但它需要熟练的操作员。应该做什么: