首頁  >  文章  >  後端開發  >  如何為正在運行的進程載入調試符號?

如何為正在運行的進程載入調試符號?

WBOY
WBOY轉載
2024-02-09 11:18:08791瀏覽

如何為正在運行的進程載入調試符號?

php小編小新為您介紹如何為正在執行的進程載入偵錯符號。在軟體開發過程中,調試是一個非常重要的環節。當我們遇到正在運行的進程出現問題時,我們需要載入偵錯符號來進行偵錯。調試符號包含了程式碼的符號訊息,能夠讓我們在調試過程中更準確地定位問題所在。在這篇文章中,我們將詳細講解如何為正在運行的進程載入偵錯符號,幫助您更好地進行偵錯工作。

問題內容

我有一個在許多機器上運行的 C 應用程序,有時一個實例會出現​​問題並且表現得很奇怪。不幸的是,這種情況幾乎從未發生過。這些產品實例經過大量最佳化(-march=XXX -Ofast)進行編譯,並且不包含任何偵錯符號,因此我無法輕鬆附加偵錯器來分析它們的狀態。

但我認為應該可以使用相同的標誌加上 -g3 再次編譯應用程序,然後我可以使用 symbol-file application_executable_with_debug_symbols 將其加載到 gdb 中。但是,如果我這樣做,那麼斷點永遠不會觸發。

是否有另一種方法可以將偵錯器附加到正在運行的應用程式並載入偵錯符號?或者我做錯了什麼(明顯的)?

謝謝

解決方法

最佳實踐是使用調試符號構建應用程序,保留生成的二進製文件以進行調試,但運行strip -g app.debug - o app.release 並在生產中運行剝離的二進位。

當您發現行為異常的實例時,您可以將完整偵錯版本複製到目標計算機,然後運行 gdb -ex 'attach $PID' app.debug。瞧:你有完整的調試符號。

再次編譯應用程式不起作用的最可能原因是您獲得了具有不同符號的新二進位(比較nm app.debugnm app.release),以及最可能的原因 (如果使用GCC)是您省略了一些用於構建app.release 的最佳化標誌,或者您使用了略有不同的來源- 您必須使用完全相同的標誌(並添加-g)和完全相同的來源,以實現該方法的成功。

以上是如何為正在運行的進程載入調試符號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除