無論是linux系統,還是windows系統,我們都有可能因為各種原因導致程序崩潰,那么這種情況下如何確認崩潰在哪了呢?
windows系統
這里是采用windows的api來產生dump文件
產生minidump的方法,網上都有,可以搜一下。
#include "DumpManager.h"
void main()
{
DumpManager dump_manager(true);
char* p = NULL;
memcpy(p, "Hello", strlen("Hello"));
}
注:這里的DumpManager.h是崩潰后生成dump的文件
崩潰后的樣子,可能不同的人寫出來的形式不一樣,或者彈出小窗,或者直接打印,或者發送監控消息給客戶端,看自己實現吧!這里我采用直接打印:
調試開始前的準備:
這里的優化一定要關掉,否則會導致dunp文件里面的調試信息和代碼對不上。
如果程序有可能產生windows底層的異常,這里也一定要切換
因為dump文件要和pdb一起使用,所以這里一定要生成pdb文件,否則一切白搭。
開始調試:
程序崩潰后,程序運行目錄下面會生成dump文件,這個文件名由自己生成dump的函數決定。
這個時候,只需要用VS直接打開dump文件,就會進入到VS的調試界面
對著畫線的部分,右鍵然后進入調試狀態,這里兩個選項可以隨便選:
注意:如果這里出現一些識別不了的dll函數,就需要將對應的dll以及pdb拷貝過來,如果dll是操作系統里面的,只需要從微軟的服務器下載就可以了。
這里彈出的框里面會提示異常的信息,指針指向的地方就是崩潰的位置。然后就和本地的程序調試一樣,看各個值就可以了,這里不再贅述了。
Linux系統
調試開始前要準備的工作:開啟生成核心文件(一次執行只對一個終端窗口有效,所以一旦終端關閉,就需要重新執行)
命令如下:
ulimit -c unlimited 這里是不限制core文件的大小,也可以限制core文件的大小,這個自行搜索吧!
代碼如下:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int i = 0;
char* pTmp = NULL;
printf("%d\n", *pTmp);
return;
}
編譯,執行:
這里據說編譯的時候必須加上-g 選項,否則用gdb調試的時候就會定位不到源代碼,只能定位到二進制的地址。
運行程序以后,會在程序運行目錄下生成一個core文件:
調試開始:
輸入gdb 程序名 core文件名 就可以調試了,這里輸出了一堆的信息,太多不想看?繼續輸入bt試試:
就這樣可以定位到問題了。
通過對比還是可以發現linux下調試還是要比windows好用,不同的操作系統。dll都不一樣,然后我們就必須拷dll到我們的輸出目錄下,很麻煩。就這樣了,over。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。