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

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工具运行这个程序,但是没有得到关于上面这段代码的任何重要信息。
我正在解析的文件只有一条记录。
任何指点都是值得赞赏的。谢谢。

最佳答案

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

关于c - memset 和SIGSEGV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/560155/

10-13 06:29