記憶集和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中查明問題。

相關文章
相關標籤/搜索