1

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

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

4 回答 4

2

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

于 2009-02-18T07:56:29.800 回答
1

我怀疑对函数的调用,所以确保调用不是类似的

char pc_buf_err_recno[SMALLER_THAN_LOGBUFF];
char ps_logbuf[TOO_SMALL]
app_ErrDesc(ps_logbuf, pc_buf_err_recno);
于 2009-02-18T07:52:21.510 回答
1

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

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

于 2009-02-18T08:03:46.460 回答
1

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

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

于 2009-02-18T08:05:18.750 回答