使用C源代码查找可能问题的工具和方法

时间:2011-12-12 17:16:59

标签: c

编辑感谢您的所有投入。我想我的问题只是有点模糊。因此我接受了一个明智的答案并选择了2个小时的顽固退出(9)调试并发现,或者至少删除了两个错误,现在我很自豪能够解决一个困难的谜语......; - )

我在http://www.spoj.pl上为问题解决方案投入了大量时间,并且该程序在本地使用我自己创建的所有测试样本,以及问题描述中的那些样本。

但是,程序在服务器上以SIGSEGV中止。在那里,我上传了它,并选择了C99 strict语言选项。

编辑:让我再次明确指出,SIGSEGV如何发生绝对没有任何暗示。我拥有的唯一信息是它发生了。感谢@Oli Charlesworth指出这一点。

在本地,我已用两个编译

gcc -Wall -Wextra -std=c99 -o prog prog.c

gcc -Wall -Wextra -m32 -std=c99 -o prog prog.c

一切正常。 64位版本是在常规的Debian squeeze amd64系统上编译的,-m32版本在常规Debian Lenny amd64系统上编译(但仅因为Squeeze被-m32打破)。

valgrind -v对我的计划也很好。

我的所有malloccalloc都确保返回值非零。除了tsearch之外,我没有使用任何东西,除了非常常见的标准函数。

我想收集一些指示,告诉我如何找出问题所在。 (如果有任何东西,但假设输入具有意外的属性)

2 个答案:

答案 0 :(得分:2)

在反馈有限的环境中,您可以使用的一个工具是我称之为“二元搜索”的问题来源:

首先上传将在服务器上运行的最简单的“hello world”程序,并验证它是否不会崩溃。然后,开始添加代码块,直到程序 崩溃。当它发生时,回溯并添加较小的代码块,直到您将其缩小到导致崩溃的特定代码段。

一旦缩小范围,您可以尝试重新编写麻烦的代码块,或者寻找不同的方法来实现正确的结果。

答案 1 :(得分:0)

使用“-g”编译。

执行命令

ulimit -c

如果返回0或少量字节,则输入以下内容:

ulimit -c unlimited

这允许转储无限大小的核心。您将需要检查核心转储以查看发生分段错误的位置。在核心文件上运行gdb以查找此信息。它会指向导致核心转储的行,并可能为您提供有关其出现故障的更多信息。

有关使用gdb检查核心转储的信息,请参阅此链接:

http://www.network-theory.co.uk/docs/gccintro/gccintro_38.html

该链接提供了更多信息。