無(wú)論是linux系統(tǒng),還是windows系統(tǒng),我們都有可能因?yàn)楦鞣N原因?qū)е鲁绦虮罎ⅲ敲催@種情況下如何確認(rèn)崩潰在哪了呢?
成都創(chuàng)新互聯(lián)公司專(zhuān)注于巴馬網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供巴馬營(yíng)銷(xiāo)型網(wǎng)站建設(shè),巴馬網(wǎng)站制作、巴馬網(wǎng)頁(yè)設(shè)計(jì)、巴馬網(wǎng)站官網(wǎng)定制、重慶小程序開(kāi)發(fā)公司服務(wù),打造巴馬網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供巴馬網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
windows系統(tǒng)
這里是采用windows的api來(lái)產(chǎn)生dump文件
產(chǎn)生minidump的方法,網(wǎng)上都有,可以搜一下。
#include "DumpManager.h"
void main()
{
DumpManager dump_manager(true);
char* p = NULL;
memcpy(p, "Hello", strlen("Hello"));
}
注:這里的DumpManager.h是崩潰后生成dump的文件
崩潰后的樣子,可能不同的人寫(xiě)出來(lái)的形式不一樣,或者彈出小窗,或者直接打印,或者發(fā)送監(jiān)控消息給客戶(hù)端,看自己實(shí)現(xiàn)吧!這里我采用直接打印:
調(diào)試開(kāi)始前的準(zhǔn)備:
這里的優(yōu)化一定要關(guān)掉,否則會(huì)導(dǎo)致dunp文件里面的調(diào)試信息和代碼對(duì)不上。
如果程序有可能產(chǎn)生windows底層的異常,這里也一定要切換
因?yàn)閐ump文件要和pdb一起使用,所以這里一定要生成pdb文件,否則一切白搭。
開(kāi)始調(diào)試:
程序崩潰后,程序運(yùn)行目錄下面會(huì)生成dump文件,這個(gè)文件名由自己生成dump的函數(shù)決定。
這個(gè)時(shí)候,只需要用VS直接打開(kāi)dump文件,就會(huì)進(jìn)入到VS的調(diào)試界面
對(duì)著畫(huà)線(xiàn)的部分,右鍵然后進(jìn)入調(diào)試狀態(tài),這里兩個(gè)選項(xiàng)可以隨便選:
注意:如果這里出現(xiàn)一些識(shí)別不了的dll函數(shù),就需要將對(duì)應(yīng)的dll以及pdb拷貝過(guò)來(lái),如果dll是操作系統(tǒng)里面的,只需要從微軟的服務(wù)器下載就可以了。
這里彈出的框里面會(huì)提示異常的信息,指針指向的地方就是崩潰的位置。然后就和本地的程序調(diào)試一樣,看各個(gè)值就可以了,這里不再贅述了。
Linux系統(tǒng)
調(diào)試開(kāi)始前要準(zhǔn)備的工作:開(kāi)啟生成核心文件(一次執(zhí)行只對(duì)一個(gè)終端窗口有效,所以一旦終端關(guān)閉,就需要重新執(zhí)行)
命令如下:
ulimit -c unlimited 這里是不限制core文件的大小,也可以限制core文件的大小,這個(gè)自行搜索吧!
代碼如下:
#include
#include
void main()
{
int i = 0;
char* pTmp = NULL;
printf("%d\n", *pTmp);
return;
}
編譯,執(zhí)行:
這里據(jù)說(shuō)編譯的時(shí)候必須加上-g 選項(xiàng),否則用gdb調(diào)試的時(shí)候就會(huì)定位不到源代碼,只能定位到二進(jìn)制的地址。
運(yùn)行程序以后,會(huì)在程序運(yùn)行目錄下生成一個(gè)core文件:
調(diào)試開(kāi)始:
輸入gdb 程序名 core文件名 就可以調(diào)試了,這里輸出了一堆的信息,太多不想看?繼續(xù)輸入bt試試:
就這樣可以定位到問(wèn)題了。
通過(guò)對(duì)比還是可以發(fā)現(xiàn)linux下調(diào)試還是要比windows好用,不同的操作系統(tǒng)。dll都不一樣,然后我們就必須拷dll到我們的輸出目錄下,很麻煩。就這樣了,over。