2013-12-12 40 views
-1

我運行了一個C程序,它創建了段錯誤並創建了核心文件。 我需要清楚說明在覈心文件中發生分段錯誤的位置。 如何閱讀該核心文件。如何在覈心文件中找到錯誤?

#include "stdio.h" 
main() 
{ 
    char *ptr; 
    *ptr=100; 
    printf("\nPointer Value is :%s\n", ptr) ; 
} 

你要運行這個程序,並更改核心文件大小的ulimit無限的 使用此命令:

$ulimit -c unlimited 

然後編譯此C程序並運行發生程序段故障,並核心文件 將被創建。如何讀取核心文件並找出分段故障發生的位置。

在此先感謝。

回答

4

你有一個指針,它是未初始化的(即你不指向任何東西)。作爲所有未初始化的局部變量,它的值是不確定的,可能是隨機的,所以你不知道它指向哪裏。

然後,您嘗試向該隨機位置寫入一個數字,並導致未定義的行爲。未定義行爲是不可預測的,並且它可以工作,它可以導致意想不到的事情發生,它可能崩潰程序,或者它可能甚至引起nasal demons

進一步嘗試使用指針作爲一個字符串,一旦增益導致的未定義行爲的兩個實例:一旦因爲指針未初始化,並再次當printf字節後讀取字節找到字符串結束。


還有未定義行爲的另一種情況,那就是你的main函數沒有被正確定義。它應該返回一個int並採取void參數或intchar**參數。這是C規範。沒有合適的main在技術上是非法的程序,但不幸的是,編譯器讓它滑落很常見。


要在調試器中使用它,你要麼在調試器中運行該程序:

$ gdb ./myProgram 
... 
(gdb) run 
Starting program: /home/someone/myProgram 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400518 in main() at myProgram.c:5 
5  *ptr=100; 
(gdb) 

或者崩潰,並創建一個核心轉儲後,運行使用核心轉儲調試器:

$ ./myProgram 
Segmentation fault (core dumped) 
$ gdb ./myProgram core 
... 
Reading symbols from /home/someone/myProgram...done. 
[New LWP 4655] 

Core was generated by `./myProgram'. 
Program terminated with signal 11, Segmentation fault. 
#0 0x0000000000400518 in main() at myProgram.c:5 
5  *ptr=100; 
(gdb) 

順便說一下,對於調試信息(調試器讀取的「符號」),程序必須用-g標誌進行編譯。

+0

問題的措辭有點含糊不清,但我認爲這個問題更多的是關於「如何閱讀核心轉儲文件來確定問題」,以防程序比這個例子更簡單。 – DCoder

+0

@DCoder yes請問我在問什麼...... –

+0

@Q_SaD更新了我的回答 –

2

您需要了解如何使用調試器。我猜你正在使用Linux。

因此,首先,編譯你的程序與

gcc -g -Wall prog.c -o progbin 

你會得到一個警告約ptr未初始化;請解決這個問題。你可能需要像

char somebuf[10]; 
ptr = somebuf; 

或類似

ptr = malloc(10); 
if (!ptr) { perror("malloc"); exit(EXIT_FAILURE); }; 

然後使用調試現場

gdb progbin 

(gdb)提示符下,鍵入help。然後讀取GDB documentation:非常有用的GDB命令是bt(回溯),r(運行),b(休息),c(繼續),p(打印),n(下一個),s(步驟),watch ...

要進行調試(即「讀一個核心文件」)一個核心轉儲,您已經有:

gdb progbin core 

,並使用一些gdb命令,尤其是bt(回溯,得到call stack)和p (至打印一些變量或表達式,並通過調用堆棧遍歷);請確保progbin是使用編譯器的-g選項構建的。

給定一個core文件,您可能會收到使用file core命令崩潰的程序文件。

+1

RTFM式的評論是沒有用的。 – hillu

+0

這很有用,謝謝 –

+0

好吧,在RTFM之後添加了一些物質之後,我把那個(和-1)放回去了。 – hillu

1

你可以通過將它傳遞給gdb來讀取你的coredump文件。 根據wikipedia核心轉儲文件包含計算機程序在特定時間的工作內存的記錄狀態,通常在程序異常終止(崩潰)時。

通常gdb接受可執行文件用於調試目的。如果您將可執行文件傳遞給gdb,它會執行該程序並提供相關信息。

如果您將coredump文件與可執行文件一起傳遞給gdb,它會檢查您的程序,因爲它之前崩潰了。

+1

好,但'gdb'不會執行'core'轉儲中的程序,只需檢查它! –

+0

@BasileStarynkevitch,這就是我的意思說...你可以編輯我的帖子,使其很好。 – Chinna

2

編譯與調試 註釋很少或沒有優化,這將被調試器使用的程序,使事情變得更容易 :

$ gcc -g -ggdb -O0 foo.c -o foo 

加載核心文件到GDB後...

$ gdb progbin core 

...其中發生的是印刷在碰撞位置:

Core was generated by `./foo'. 
Program terminated with signal 11, Segmentation fault. 
#0 0x0000000000400509 in main() at foo.c:5 
5   *ptr=100; 

在更復雜的程序中,打印回溯是有意義的。 (在 這個微不足道的程序,它會讓你沒有更多有用的信息:

(gdb) bt 
#0 0x0000000000400509 in main() at foo.c:5