簡體   English   中英

Linux / C ++如何調試發布應用程序

[英]Linux/C++ How to debug release application

我有linux c ++多線程應用程序。 現在它已在生產服務器上進行測試並具有段錯誤。 問題是我無法在任何測試服務器上重現該錯誤,也無法訪問生產服務器。 我沒有轉儲或任何其他有用的信息。 只有行:segfault at 0000000046bf0fb8 rip 000000000048ac6b rsp 0000000046bf0fa0 error 6

我想問社區我可以從這條線路獲得一些信息,這些信息將有助於減少我應該搜索的地方的區域。 由於速度慢,我無法在生產上運行調試版本。 我可以添加什么來幫助我調試? 這個bug看起來像多線程的bug,很難重現。 但我不確定,因為應用程序可以處理來自MTA的許多不同的電子郵件。

平台:Linux

編譯器行:g ++ -O3 -D_REENTRANT

謝謝。

upd。:謝謝你的回答。 我可以包含調試信息。 我想知道調試發布版本的基本方法。 例如,我有轉儲和發布版本。 我該怎么辦? 我該怎么讀? 您能用幾句話解釋如何調試應用程序嗎? 謝謝。

正如Andy所說,在發布版本時保留調試符號。

如果這使得完成的可執行文件的大小不可接受地大,那么您可以復制最終的可執行文件並通過strip運行它以刪除調試符號。 這樣你就有兩個相同的可執行文件,除了一個有調試符號而另一個沒有。 將沒有符號的那個放在生產服務器上。 當它發生段錯誤時,請對仍包含調試符號的可執行文件的副本進行調試。

我最近一直在閱讀gdb手冊,他們建議將調試符號留在例如g++ -g

由於您無權訪問生產服務器,因此可能包含一些將數據輸出到文本文件的基本日志記錄功能。 您應該能夠大致縮小發生錯誤的位置,具體取決於哪些數據已輸出到您的日志文件。

即使您沒有使用調試標志構建應用程序,也可以使用gdb在segfaults的位置獲取程序的回溯。 這至少可以讓您了解應用程序段錯誤的位置。

gdb <your_app_exe>
gdb> run
gdb> backtrace

要么

gdb <your_app_exe>
gdb> core-file <generated_core_file>

您可以(並且應該)使用調試信息構建版本可執行文件。 如果您不想分發包含調試信息的可執行文件,則可以調試信息分開並稍后安裝以進行調試。 這就是我們在申請中所做的事情。

好吧,我發現了另一個解決方案,我非常頻繁地使用,我們通常得到堆棧(在這種情況下我們得到)。

我有一個可執行文件,我們部署在一些嵌入式平台上。 假設我的可執行文件是服務器。 我使用addr2line -e ./server並粘貼我從客戶那里得到的堆棧。 它會告訴你問題發生的細節。

它可能會幫助你。

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM