我一直在一段代碼中遇到一個奇怪的問題。 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
任何指針表示讚揚。 謝謝。 指針
我懷疑該函數的調用,因此請確保該調用不是相似的東西 調試
char pc_buf_err_recno[SMALLER_THAN_LOGBUFF]; char ps_logbuf[TOO_SMALL] app_ErrDesc(ps_logbuf, pc_buf_err_recno);
多是第二個內存集,緣由是調用外部函數的緩衝區大小不足。 調試器可能沒法正確顯示您的位置。 嘗試在每一個步驟以後添加日誌記錄,以找出形成崩潰的確切緣由。 日誌
調試器多是不正確的,尤爲是在得到SEGV的狀況下。 請記住,當您遇到分段錯誤時,頗有可能已經將堆棧浪費了,若是發生這種狀況,調試器將感到困惑。 code
調用函數也極可能搞砸了,而不是當前的。 內存
更奇怪的是,在gdb內部,同一行執行了大約30次,儘管該函數僅被調用一次,而且內部沒有循環!
這聽起來彷佛帶有優化編譯的徵兆。 若是在關閉優化的狀況下進行編譯,則可能會更輕鬆地在GDB中查明問題。