memset和SIGSEGV

问题描述:

我一直在一段代码中遇到一个奇怪的问题。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工具运行的程序,但没有得到任何关于上面这段代码显著。

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

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

+0

请向我们提供周围的app_ErrDesc调用 – 2009-02-18 08:44:36

这可能是因为它的第二memset的,原因是外部函数调用不足缓冲区大小。调试器可以错误地显示你的位置。尝试在每个步骤之后添加日志记录以查明究竟是什么崩溃。

我怀疑电话的功能,所以保证了呼叫不是像

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

调试器可能不正确,特别是如果你要SEGV。请记住,当发生分段错误时,很有可能抛弃了堆栈,如果发生这种情况,调试器会感到困惑。

它也很可能调用函数做了一个烂摊子,不是当前。

更奇怪的是,在gdb里面,同一行执行了大约30次,但函数只被调用一次,里面没有循环!

这听起来对症已经与优化编译的。如果在关闭优化的情况下进行编译,则可能会更容易查明GDB中的问题。