我正在使用C编写UNIX shell,自从我开始使用GNU Readline以来,我遇到了最奇怪的错误。
分段错误和SIGABRT信号几乎完全随机出现。 GDB从未向我展示过两次相同的问题原因。
我在pastebin中发布我的代码。
我想我要问的是,如果有人能帮助我调试,或者至少检查我的部分代码,我会感到非常荣幸。我还是编程新手,非常感谢我能得到的任何帮助。
问候。
答案 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,那将会发生什么?``