C編寫的程序運(yùn)行效率高,但是 C 的好處和壞處是它允許直接操作內(nèi)存,如果使用不小心,這就會(huì)導(dǎo)致程序的非法推出而且當(dāng)程序過(guò)大時(shí),此類錯(cuò)誤非常難查,下面介紹一種方法,從錯(cuò)誤的內(nèi)存地址反向查找出問(wèn)題的程序
linux 平臺(tái):
1. 在程序信號(hào)處理部分, 加入代碼捕捉引起錯(cuò)誤點(diǎn)的地址,簡(jiǎn)單來(lái)說(shuō),方法就是在注冊(cè)自己的信號(hào)處理函數(shù),在這個(gè)函數(shù)中加入獲取內(nèi)存錯(cuò)誤地址的代碼,并把結(jié)果寫到一個(gè)日志文件中。
2. 編譯 DEBUG 版本 程序 (compile 時(shí)用 -g , 生成可執(zhí)行文件后不用 strip 去掉symbol 信息)
3. 在程序出問(wèn)題時(shí), 查看日志記錄, 得到錯(cuò)誤點(diǎn)的地址.
4. 用objdump -S 導(dǎo)出Debug 版本的匯編代碼, 查找錯(cuò)誤地址, 則得出那條語(yǔ)句出錯(cuò).
windows 下c 語(yǔ)言調(diào)試
1. release 版編譯/連接選項(xiàng), 把"generate debug info\" 打鉤選擇
2.dumpbin /DISASM /OUT:dump.out.txt.1 prep.exe 可反編譯exe文件
3.得到程序非法地址(可從管理工具-》事件查看器里得到),與匯編比較。
linux 平臺(tái):
1. 在程序信號(hào)處理部分, 加入代碼捕捉引起錯(cuò)誤點(diǎn)的地址,簡(jiǎn)單來(lái)說(shuō),方法就是在注冊(cè)自己的信號(hào)處理函數(shù),在這個(gè)函數(shù)中加入獲取內(nèi)存錯(cuò)誤地址的代碼,并把結(jié)果寫到一個(gè)日志文件中。
2. 編譯 DEBUG 版本 程序 (compile 時(shí)用 -g , 生成可執(zhí)行文件后不用 strip 去掉symbol 信息)
3. 在程序出問(wèn)題時(shí), 查看日志記錄, 得到錯(cuò)誤點(diǎn)的地址.
4. 用objdump -S 導(dǎo)出Debug 版本的匯編代碼, 查找錯(cuò)誤地址, 則得出那條語(yǔ)句出錯(cuò).
windows 下c 語(yǔ)言調(diào)試
1. release 版編譯/連接選項(xiàng), 把"generate debug info\" 打鉤選擇
2.dumpbin /DISASM /OUT:dump.out.txt.1 prep.exe 可反編譯exe文件
3.得到程序非法地址(可從管理工具-》事件查看器里得到),與匯編比較。