记忆集和SIGSEGV

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

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);
        .....
        .....
 }

因为某种缘由,第一个内存集调用会发送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工具运行该程序,但对上述代码没有任何意义。 优化

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

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


#1楼

我怀疑该函数的调用,因此请确保该调用不是相似的东西 调试

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

#2楼

多是第二个内存集,缘由是调用外部函数的缓冲区大小不足。 调试器可能没法正确显示您的位置。 尝试在每一个步骤以后添加日志记录,以找出形成崩溃的确切缘由。 日志


#3楼

调试器多是不正确的,尤为是在得到SEGV的状况下。 请记住,当您遇到分段错误时,颇有可能已经将堆栈浪费了,若是发生这种状况,调试器将感到困惑。 code

调用函数也极可能搞砸了,而不是当前的。 内存


#4楼

更奇怪的是,在gdb内部,同一行执行了大约30次,尽管该函数仅被调用一次,而且内部没有循环!

这听起来彷佛带有优化编译的征兆。 若是在关闭优化的状况下进行编译,则可能会更轻松地在GDB中查明问题。

相关文章
相关标签/搜索