memset和SIGSEGV

时间:2009-02-18 07:27:03

标签: c memory memset sigsegv

我在一段代码中遇到了一个奇怪的问题。

void app_ErrDesc(char *ps_logbuf, char *pc_buf_err_recno)
 {
    char *pc_logbuf_in;
    char rec_num[10];
    char *y = "|";
    int i, j;

    memset(rec_num, 0, sizeof(rec_num));
    memset(pc_buf_err_recno, 0, LOGBUFF);
        .....
        .....
 }

由于某种原因,第一个memset调用发送SIGSEGV。更奇怪的是什么时候 在gdb内部,虽然调用了函数,但同一行执行了大约30次 只有一次,里面没有循环!这是一段gdb会话。

7295            /*Point to logbuffer string*/
(gdb)
7292            memset(rec_num, 0, sizeof(rec_num));
(gdb)
7295            /*Point to logbuffer string*/
(gdb)
7292            memset(rec_num, 0, sizeof(rec_num));
(gdb) n
7295            /*Point to logbuffer string*/
(gdb)
7292            memset(rec_num, 0, sizeof(rec_num));
(gdb)

编程接收信号SIGSEGV,分段故障。

我也试过通过valgrind的memcheck工具运行程序,但没有对上面的代码有任何重要意义。

我正在解析的文件只有一条记录。

任何指针都表示赞赏。感谢。

4 个答案:

答案 0 :(得分:2)

它可能是第二个memset,原因是外部函数在缓冲区大小不足的情况下被调用。调试器可能显示不正确的位置。尝试在每个步骤后添加日志记录以找出确切崩溃的内容。

答案 1 :(得分:1)

我怀疑对该函数的调用,因此请确保调用不是

char pc_buf_err_recno[SMALLER_THAN_LOGBUFF];
char ps_logbuf[TOO_SMALL]
app_ErrDesc(ps_logbuf, pc_buf_err_recno);

答案 2 :(得分:1)

调试器可能不正确,尤其是在您获得SEGV时。请记住,当你遇到分段错误时,你很可能已经破坏了堆栈,如果发生这种情况,调试器会感到困惑。

调用函数也很可能弄得一团糟,而不是现在的。

答案 3 :(得分:1)

  

更奇怪的是,当在gdb内部时,同一行执行了大约30次,虽然该函数只被调用一次并且内部没有循环!

这听起来有使用优化编译的症状。如果在关闭优化的情况下进行编译,您可能会更容易在GDB中查明问题。