Segmentation fault when running mpi program with mpirun

助教您好,我在使用mpirun後跑出了以下錯誤訊息,想請問可能是什麼問題

image.png

同學好,

我猜測你可能正在編譯你撰寫的 MPI 程式。你的程式中可能包含一些錯誤,導致 Segmentation fault 的發生。

Segmentation fault 介紹

Segmentation fault(分段錯誤)是一種常見的程式錯誤,當程式嘗試訪問未分配給它的記憶體位址時,就會發生此錯誤。這種錯誤通常會導致程式當機。當程式執行時,它會把可用的記憶體區塊分為幾個部分,例如程式碼區段、資料區段、Stack 等等。當程式試圖訪問一個未分配的、不存在的或不合法的記憶體位址時,就會導致分段錯誤。

常見導致分段錯誤的原因包括:

  • 嘗試訪問 NULL 指標或未初始化的指標。
  • 訪問已經被釋放的記憶體。
  • 訪問不合法的記憶體位址,例如超出了陣列邊界、訪問未分配的 Heap 記憶體等等。
  • Stack 溢位,例如遞迴函式太多層、函式中使用太多區域變數等等。

Segmentation fault 預防及 Debug

通常我們可以嘗試「預防」和「修復」Segmentation fault。

  • 預防:在編譯時期使用工具進行記憶體檢測。開發者可以使用一些工具來檢測程式中的記憶體問題,例如 AddressSanitizer、Electric Fence 等等。這些工具可以檢測出程式中的記憶體溢位、雙重釋放、未初始化的記憶體等問題。
  • 修復:使用除錯工具。開發者可以使用一些除錯工具來協助定位問題,例如 gdb(GNU Debugger)、valgrind、lldb 等等。這些工具可以讓開發者在程式執行時暫停程式運行,查看程式狀態和變數值,並進行單步調試、設置斷點等等操作。

今天我們著重描述如何定位 Segmentation fault 在程式碼中的發生位置,以利修復 Bug。

Debug Segmentation fault

使用 gdb 在 debug segmentation fault 的過程中,可以使用 bt (backtrace) 命令查看函式的調用堆疊。具體步驟如下:

  1. 使用 -g 編譯你的程式。
  2. 開啟 gdb,指定需要 debug 的程式。
    gdb my_prog.out
  3. 使用 run 命令執行程式。
    run
  4. 程式運行到 Error 時,使用 bt 命令查看函式調用堆疊。
    bt
  5. 如果發現問題函式,可以使用 frame 命令進入該函式調用堆疊中,查看該函式的參數和變數。
    frame 0

根據 btframe 指令的輸出,找到導致 segmentation fault 的函式呼叫,並修復程式碼。

展佑

*本文部分使用 ChatGPT 輔助生成