Unix shell C代码:随机错误

时间:2011-01-14 01:54:25

标签: linux shell unix

我正在使用C编写UNIX shell,自从我开始使用GNU Readline以来,我遇到了最奇怪的错误。

分段错误和SIGABRT信号几乎完全随机出现。 GDB从未向我展示过两次相同的问题原因。

我在pastebin中发布我的代码。

Agros.h

Agros.c

Main.c

我想我要问的是,如果有人能帮助我调试,或者至少检查我的部分代码,我会感到非常荣幸。我还是编程新手,非常感谢我能得到的任何帮助。

问候。

3 个答案:

答案 0 :(得分:4)

我试图编译你的代码,编译器警告我一个危险的问题:

agros.c: In function ‘return_prompt’:
agros.c:114:5: warning: function returns address of local variable

这是典型的新手错误,很容易成为您描述的随机故障的原因。 您返回的“提示”的值将被以下函数调用参数覆盖,因为它驻留在程序堆栈中,这可能导致随机内存“损坏”。

答案 1 :(得分:1)

我注意到至少get_cmd_code()是错误的。我没有深入研究你的代码所以解决这个问题,如果你还有问题,请告诉我。

您的代码正在迭代命令元素的静态数组。您可以为文件开头的100个元素保留空间(在数组声明中),但实际上并没有初始化100个元素。 my_commands [4] .command_name为null,因此将其传递给strcmp()将导致段错误。

更好的做法是定义一个常量k_command_count,然后将循环从0迭代到k_command_count - 1.你还应该将my_commands定义为my_commands [k_command_count],这样就不会浪费内存。还有其他更好的做事方式,但在你学习的时候,我建议保持简单。

答案 2 :(得分:0)

我检查了不正确分配内存的常见编程错误,但一切都很好。

任何机会,只有在输入空行时才会发生段错误吗?如果是这样,parse_command()中检测到空行的逻辑强制另一个strtok()的调用。最好在那里完全跳过while循环,比如如果没有使用`word =“修改NULL,那将会发生什么?``