青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

調試經驗總結-VC下的錯誤對話框(陸續更新6.12.2008)

很早前就想寫點總結將編程中遇到的各種錯誤刨根挖底地羅列出來。但是因為這些錯誤(VC中開調試器遇到的各種錯誤對話框)都是隨機性的,真正想總結的時候又不想不起來有哪些錯誤。恰好最近運氣比較背,各種錯誤都被我遇遍了,于是恰好有機會做個總結。

這里所說的VC下的錯誤對話框時指在VC中開調試器運行程序時,IDE彈出的對話框。

1.不是錯誤的錯誤:斷言 .

將斷言視為錯誤其實有點可笑,但是因為有些同學甚至不知道這個,所以我稍微提一下。斷言對話框大致上類似于:

assert

斷言對話框是由assert引起的,在對話框上通常會給出表達式,例如assert( 0 ); 彈出對話框時就會將0這個表達式顯示出來(Expression:0)。關于assert的具體信息建議自己google。這里稍微提一下一個技巧:有時候為了讓assert提供更多的信息,我們可以這樣寫一個assert:

assert( expression && "Function : invalid argument!" );

因為字符串被用在布爾表達式中時,始終為true,不會妨礙對expression的判斷,當斷言發生時(expression為false) 時,斷言對話框上就會顯示這個字符串,從而方便我們調試。

要解決這個問題,首先要確定斷言發生的位置,如果是你自己設置的斷言被引發,就很好解決,如果是系統內部的函數產生的,那么一般是因為你傳入的函數參數無效引起。

 

2.內存相關:最簡單的非法訪問:

C、C++程序中經常誤用無效的指針,從而大致各種各樣的非法內存訪問(寫/讀)。最簡單的情況類似于:

wrongaccess

這樣的情況由類似以下代碼引起:

char *p = 0;

*p = 'a';

當你看到類似于“寫入位置XXXX時發生訪問沖突“時,那么你大致可以斷定,你的程序在某個地方訪問到非法內存。開調試器對調用堆棧進行跟蹤即可找出錯誤。

 

3.內存相關:不小心的棧上數組越界:

當你寫下類似以下的代碼時:

char str[3];

strcpy( str, "abc" );

就將看到如下的對話框:

stackerror 

對話框大致的意思就是說str周圍的棧被破壞了,因為str本身就被放在棧上,所以strcpy(str,"abc")多寫入的'\0'就寫到非法的棧區域。看到這樣的對話框可以根據調用堆棧定位到錯誤發生的函數,然后檢查此函數內部定義的數組訪問,即可解決問題。

 

4.內存相關:不小心的堆上數組越界:
并不是每次數組越界都會得到上面所描述的錯誤,當數組是在堆上分配時,情況就變得隱秘得多:

char *str = new char [2];

strcpy( str, "ab" ); //執行到這里時并不見得會崩潰

delete [] str;//但是到這里時就肯定會崩潰

以上代碼導致的錯誤對話框還要詭異些:

heaperror

似乎不同的DAMAGE對應的錯誤號(這里是47)都不一樣,因為這里的錯誤發生在delete,而delete跟new很可能在不同的地方,所以這個錯誤調試起來不是那么容易,很多時候只能靠經驗。

當看到類似的對話框時,根據調用堆棧跟到delete時,你就可以大致懷疑堆上數組越界。

 

5.調用相關:函數調用約定帶來的錯誤:

這是所有我這里描述的錯誤中最詭異的一種,先看下對話框大致的樣子:

run_functioncall2

對話框大致的意思就是說(沒開調試器時對話框樣式可能不一樣),通過函數指針調用某個函數時,函數指針的類型(函數原型)可能與函數指針指向的函數的類型不一樣。這里的類型不一致主要是調用約定(call conversation)不一樣。如果函數類型(參數個數,返回值)不一樣,一般不會出錯。

調用約定是指調用一個函數時,函數參數的壓入順序、誰來清理棧的內容等。例如默認的C、C++調用約定__cdecl,對于函數的參數是從右往左壓入。而__stdcall(WIN API的調用約定)則是從左向右壓。我這里所說的函數類型不一樣,就是指一個函數是使用__cdecl,還是__stdcall。例如以下代碼:

 

#include <iostream> 

void __stdcall show( const char *str )

{

}
 

void __stdcall show2()

{

}
 

int main()

{

typedef
void (*Func)( const char *);

void *p = show;

Func my_func
= (Func) p;

my_func(
"kevin" );

return 0;

}
 

 

因為Func默認地被處理為__cdecl,而show是__stdcall的,所以當通過函數指針my_func時,就導致了以上對話框的出現。但是當p指向show2時,又不會出錯,這是因為show2沒有參數,不同的調用約定不影響這個規則。

6.異常相關:默認終止程序

當我們使用C++庫時,因為庫本身可能會拋出C++異常,如果你不捕獲這個異常,那么C++默認就會調用abort(或者exit)函數終止程序。例如:

 

void test()
{
   
throw std::exception( "some exceptions" );
}

 

當你調用test函數時,如果不catch這個異常,開調試器就會得到類似的錯誤對話框:

 

而如果不開調試器,則會得到:

 

當你看到類似于“This application has requested the Runtime to terminate it…”之類的字眼時,那就表明程序調用了abort(或exit)函數,導致程序異常終止。其實這個錯誤只要開調試器,一般可以準確定位錯誤的發生點。

 

7.VC運行時檢查-未初始化變量

VC的調試器會對代碼進行運行時檢查,這可能會導致VC彈出對你看上去正確的代碼。這也許不是一個錯誤。例如:

int test_var;

if( test_var == -1 )
{
    test_var = 0;
}

test_var沒有初始化就進行if判斷,當運行以上代碼開調試器時,就會得到如下對話框:

withoutinit

8.破壞的堆

VC對于在堆上分配的內存都做了記錄,我想這主要用于free釋放內存時做歸還處理。

char *p = (char*) malloc( 100 );
p += 10;
free( p );

當執行以上代碼時,因為p的值已經改變,提交到free的指針值變化,VC就會給出以下錯誤提示:

bad_heap

posted on 2008-04-24 13:43 Kevin Lynx 閱讀(8241) 評論(9)  編輯 收藏 引用 所屬分類: c/c++通用編程

評論

# re: 調試經驗總結-VC下的錯誤對話框 2008-04-24 17:19 王曉軒

很好,不過好多都沒有遇到過  回復  更多評論   

# re: 調試經驗總結-VC下的錯誤對話框 2008-04-24 18:28 mm

全遭遇過了
不錯的總結  回復  更多評論   

# re: 調試經驗總結-VC下的錯誤對話框 2008-04-25 11:38 夢在天涯

chao hao !

高手一個啊!  回復  更多評論   

# re: 調試經驗總結-VC下的錯誤對話框 2008-04-26 22:28 yafare

調用相關:函數調用約定帶來的錯誤

不一定是調用約定錯誤,數組訪問越界覆蓋掉vc設置的cookie,也可能是這樣的提示  回復  更多評論   

# re: 調試經驗總結-VC下的錯誤對話框 2008-04-28 09:15 Kevin Lynx

@yafare
例如?舉個例子代碼看看?(從對話框給的內容來看,似乎就是因為函數調用錯誤)  回復  更多評論   

# re: 調試經驗總結-VC下的錯誤對話框 2008-04-28 22:00 草上飛

呵呵我剛才在Matlab中也出現了這樣的問題,想一想一小時前我還使用的好好的啊!仔細想想和操作系統相關的就是我把桌面主題給換了,隱約感覺到是這里的問題,于是我就把主題改為window XP,果然問題解決了,matlab可以正常啟動了!
  回復  更多評論   

# re: 調試經驗總結-VC下的錯誤對話框 2008-04-29 22:22 李錦俊

這些都經常遇到,還有一些很難遇到,更隱秘的錯誤才會導致的出錯對話框。  回復  更多評論   

# re: 調試經驗總結-VC下的錯誤對話框(陸續更新5.5.2008) 2008-05-09 08:59 joke

頂  回復  更多評論   

# re: 調試經驗總結-VC下的錯誤對話框(陸續更新6.12.2008) 2008-07-04 07:30 路緣

謝謝樓主分享,樓主真是有心人。  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99riav久久精品riav| 亚洲国产精品一区制服丝袜| 亚洲精品永久免费| 欧美国产日韩免费| 欧美国产欧美亚州国产日韩mv天天看完整| 在线观看中文字幕不卡| 免费一级欧美在线大片| 久久亚洲美女| 亚洲精品午夜| 一本到高清视频免费精品| 国产精品狼人久久影院观看方式| 性高湖久久久久久久久| 久久精品国产亚洲一区二区三区 | 性久久久久久久久| 国内自拍视频一区二区三区| 欧美激情第8页| 欧美日韩免费一区| 久久精品国产亚洲一区二区| 久久久一区二区| 一区二区三区四区国产| 亚洲欧美不卡| 亚洲黄色成人网| 一二美女精品欧洲| 在线成人亚洲| 中文欧美日韩| 亚洲国产天堂网精品网站| 妖精视频成人观看www| 国内久久精品视频| 亚洲福利视频一区二区| 欧美午夜精品久久久久久超碰| 香蕉成人伊视频在线观看| 久久精品视频va| 亚洲午夜视频在线| 久久午夜色播影院免费高清| 亚洲午夜激情| 看片网站欧美日韩| 欧美一级在线亚洲天堂| 久久综合伊人77777蜜臀| 欧美一级夜夜爽| 欧美日本精品一区二区三区| 久久婷婷人人澡人人喊人人爽| 欧美久久久久免费| 欧美成人午夜免费视在线看片 | 欧美国产一区二区| 久久久久www| 国产精品狼人久久影院观看方式| 欧美激情中文字幕一区二区| 国产偷自视频区视频一区二区| 亚洲免费久久| 亚洲人午夜精品| 久久久久久久久蜜桃| 性8sex亚洲区入口| 欧美午夜视频在线观看| 亚洲精品久久久蜜桃| 激情懂色av一区av二区av| 艳妇臀荡乳欲伦亚洲一区| 亚洲毛片av| 美国十次成人| 欧美成人三级在线| 一区二区三区自拍| 久久国产欧美日韩精品| 久久精品中文字幕免费mv| 国产精品日韩电影| 亚洲视频999| 亚洲一区二区欧美日韩| 欧美日韩国产999| 亚洲激情在线激情| 日韩一二在线观看| 欧美极品一区| 日韩视频一区二区三区在线播放 | 国产视频精品网| 亚洲在线一区二区三区| 亚洲一区二区三区四区在线观看| 欧美日韩久久精品| 一区二区三区 在线观看视| 亚洲免费视频中文字幕| 国产精品免费区二区三区观看| 夜夜嗨av一区二区三区网页| 亚洲影视中文字幕| 国产欧美另类| 久久激情五月丁香伊人| 欧美国产乱视频| 日韩一级大片| 国产精品国产三级国产专播精品人 | 国内精品久久国产| 久久婷婷综合激情| 亚洲国产精品一区二区尤物区| 亚洲激情不卡| 国产精品福利在线观看| 久久国产精品免费一区| 欧美国产高潮xxxx1819| 亚洲一区二区三区国产| 国产色产综合产在线视频| 巨乳诱惑日韩免费av| 亚洲毛片在线观看| 久久精品在这里| 亚洲日韩欧美视频| 国产精品久久一卡二卡| 久久精品国产成人| 亚洲欧洲在线播放| 欧美专区福利在线| 亚洲日本国产| 国产伦精品一区二区三区免费迷| 久久久久国产一区二区| 亚洲精品一区二区三区四区高清| 西瓜成人精品人成网站| 91久久黄色| 国产精品资源在线观看| 欧美激情一区二区三区在线视频观看| 亚洲一区二区三区国产| 亚洲高清二区| 久久美女艺术照精彩视频福利播放| 在线观看不卡av| 国产精品视频成人| 欧美另类videos死尸| 久久久精品性| 午夜日本精品| 一区二区三区欧美在线观看| 欧美成人四级电影| 欧美专区在线播放| 在线亚洲免费| 亚洲国产一区二区在线| 国产日韩欧美在线一区| 欧美日韩在线视频一区| 蜜臀久久久99精品久久久久久 | 午夜精品美女久久久久av福利| 91久久国产综合久久| 久久一本综合频道| 欧美在线综合视频| 亚洲在线成人| 亚洲图片欧美日产| 亚洲精品一区二区三区樱花| 精品999成人| 国产偷国产偷亚洲高清97cao| 国产精品hd| 欧美特黄a级高清免费大片a级| 欧美 日韩 国产一区二区在线视频| 欧美夜福利tv在线| 香蕉亚洲视频| 久久成人资源| 欧美在线一二三| 先锋影音久久久| 午夜精品免费在线| 亚洲女人av| 午夜精彩国产免费不卡不顿大片| 亚洲一区二区在线播放| 亚洲影视中文字幕| 一区二区av在线| 99亚洲一区二区| 亚洲视频免费| 午夜精品久久久久久久白皮肤| 午夜在线观看欧美| 久久成人18免费网站| 久久久久高清| 久久综合狠狠综合久久综合88| 玖玖视频精品| 欧美精品一区二区三区四区 | 久久久中精品2020中文| 久久久福利视频| 美女黄毛**国产精品啪啪 | 亚洲欧美制服中文字幕| 香蕉免费一区二区三区在线观看| 欧美一区二区视频在线观看2020| 久久国产精品网站| 免费在线亚洲欧美| 欧美日韩xxxxx| 国产精品美女久久久久久免费| 国产欧美日韩亚洲一区二区三区| 国内精品嫩模av私拍在线观看| 在线成人激情视频| 一区二区三区视频在线看| 午夜一区二区三区在线观看| 久久九九热re6这里有精品| 欧美电影在线免费观看网站| 亚洲精品一区在线| 午夜精品区一区二区三| 久久免费视频在线观看| 欧美少妇一区二区| 国产综合视频| 一本久道久久综合狠狠爱| 欧美一区二区精品| 欧美黄色视屏| 亚洲一二区在线| 另类av一区二区| 国产精品视频专区| 亚洲精品老司机| 久久精品亚洲一区| 亚洲精品中文字幕有码专区| 小黄鸭精品aⅴ导航网站入口| 欧美激情 亚洲a∨综合| 国产一二三精品| 亚洲视频在线观看免费| 噜噜噜躁狠狠躁狠狠精品视频 | 一本色道88久久加勒比精品| 欧美一区影院| 国产精品久久久久久久久借妻| 亚洲国产视频一区二区| 欧美在线三区| 一片黄亚洲嫩模| 欧美—级高清免费播放|