簡體   English   中英

如何獲取有關 c++ 中崩潰程序的一些信息以供將來調試

[英]How can I get some information about crashed program in c++ for future debugging

我想知道當程序在 c++ 中崩潰時,有什么方法可以捕獲一些信息。 此信息可用於開發人員未來的調試。 例如,此信息提供了我的程序在哪一行代碼和哪一行 function 或最好是為什么會崩潰。

該概念稱為 Windows 上的故障轉儲或 Linux 上的核心轉儲 這不是 C++ 的功能,而是操作系統的功能。 它適用於編譯為本機匯編指令的代碼(C++ 經常出現這種情況)。

崩潰時的崩潰程序的state會被保存,所以你可以看看調用堆棧,memory,寄存器等。信息量可以配置。 然后在調試器的幫助下完成分析,例如 Windows 上的

對於行號,請注意與二進制文件一起構建符號。 對於分析,您需要將故障轉儲與正確的符號放在一起以獲取行號。

如何獲取有關 c++ 中崩潰程序的一些信息以供將來調試

這是特定於實現的。

(實際上,編譯器特定和操作系統特定;我采用Linux為中心的觀點)

C++11 是一種編程語言,由用英文 ( n3337 ) 編寫的規范定義。 不是軟件。

您通常使用一些編譯器來編譯您的 C++ 代碼。 我建議使用最新版本的GCCClang 如果您使用它,請使用所有警告和調試信息編譯您的 C++ 代碼,即至少使用g++ -Wall -Wextra -gclang++ -Wall -Wextra -g 一些編譯器能夠在發出調試信息時進行優化(例如,您可以運行g++ -Wall -Wextra -g -Og ,就像我們在RefPerSys中所做的那樣)。 您有時還可以使用ANTLRGNU bison等工具生成C++ 代碼 - 甚至是其他一些 C++ 程序 - (這種方法稱為元編程)。

一旦你用DWARF調試信息編譯了你的 C++ 代碼(也許也使用像GNU make這樣的構建自動化工具),你可以(至少在 Linux 上)使用GDB 由於gdb(1)可以處理core(5)轉儲(參見signal(7) )。

當然,如果你在 C++ 中編寫操作系統kernel (就像這個),情況就不同了。

在不偏離上述內容的情況下,我認為您需要構建一個信號處理程序,該處理程序可以執行回溯到代碼中它崩潰的位置。 類似的東西

void signalHandler(int signal)
{
    void *array[500];
    size_t size;

    // get void*'s for all entries on the stack
    size = backtrace(array, 500);
    // print out all the frames to stderr
    
    fprintf(stderr, "Error: signal %d:\n", signal);
    backtrace_symbols_fd(array, size, STDERR_FILENO);
    exit(1);
}


void registerSignalHandler()
{
    signal(SIGSEGV, signalHandler);
}

int main(int argc, char* argv[])
{

    registerSignalHandler();
    
   // your code 
   return 1;
}

google::InstallFailureSignalHandler(); 可以給我們提供信息。 它還會自動打印調用堆棧。 這是非常容易使用。 有關詳細信息,請參閱http://rpg.ifi.uzh.ch/docs/glog.html

暫無
暫無

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

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