[英]Where can I get information about the C/C++ linker in Visual Studio?
[英]How can I get some information about crashed program in c++ for future debugging
我想知道當程序在 c++ 中崩潰時,有什么方法可以捕獲一些信息。 此信息可用於開發人員未來的調試。 例如,此信息提供了我的程序在哪一行代碼和哪一行 function 或最好是為什么會崩潰。
該概念稱為 Windows 上的故障轉儲或 Linux 上的核心轉儲。 這不是 C++ 的功能,而是操作系統的功能。 它適用於編譯為本機匯編指令的代碼(C++ 經常出現這種情況)。
崩潰時的崩潰程序的state會被保存,所以你可以看看調用堆棧,memory,寄存器等。信息量可以配置。 然后在調試器的幫助下完成分析,例如 Windows 上的windbg 。
對於行號,請注意與二進制文件一起構建符號。 對於分析,您需要將故障轉儲與正確的符號放在一起以獲取行號。
如何獲取有關 c++ 中崩潰程序的一些信息以供將來調試
(實際上,編譯器特定和操作系統特定;我采用Linux為中心的觀點)
您通常使用一些編譯器來編譯您的 C++ 代碼。 我建議使用最新版本的GCC或Clang 。 如果您使用它,請使用所有警告和調試信息編譯您的 C++ 代碼,即至少使用g++ -Wall -Wextra -g
或clang++ -Wall -Wextra -g
。 一些編譯器能夠在發出調試信息時進行優化(例如,您可以運行g++ -Wall -Wextra -g -Og
,就像我們在RefPerSys中所做的那樣)。 您有時還可以使用ANTLR或GNU bison等工具生成C++ 代碼 - 甚至是其他一些 C++ 程序 - (這種方法稱為元編程)。
一旦你用DWARF調試信息編譯了你的 C++ 代碼(也許也使用像GNU make這樣的構建自動化工具),你可以(至少在 Linux 上)使用GDB 由於gdb(1)可以處理core(5)轉儲(參見signal(7) )。
在不偏離上述內容的情況下,我認為您需要構建一個信號處理程序,該處理程序可以執行回溯到代碼中它崩潰的位置。 類似的東西
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.