编辑感谢您的所有投入。我想我的问题只是有点模糊。因此我接受了一个明智的答案并选择了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
对我的计划也很好。
我的所有malloc
和calloc
都确保返回值非零。除了tsearch
之外,我没有使用任何东西,除了非常常见的标准函数。
我想收集一些指示,告诉我如何找出问题所在。 (如果有任何东西,但假设输入具有意外的属性)
答案 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
该链接提供了更多信息。