Access Violation at address 32665A01 in Module 'CC |
尚未結案
|
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
|
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
以下是轉貼的資料來自於: http://WWW.CSDN.COM 跟蹤訪問衝突Avs的位置 如果一個AV的起因源自於試圖訪問沒有初始化的類的屬性(或方法),在沒有多少代碼的情況下這是很容易識別的。但另一方面如果有一大堆代碼時,或者AV出現在多次重復的循環體中的話,就相當有難度了。幸運的是,(C Builder內或外的)AV的錯誤資訊是通過視窗顯示的。這有助於辨別由於非法記憶體訪問引起的錯誤。有兩件事必須在頭腦中牢記:a)別讓十六進位的符號嚇倒你。b)更別害怕CPU窗口。
考慮如下的代碼段:
Tedit *EditBox;
EditBox->AutoSelect = false;
這在語法上似乎是正確的,事實上編譯器也不會報錯。當然,問題在運行時就會暴露出來。運行時,會得到類似"Access Violation at (someaddress) in module Vcl40.bpl. Read of address 000001F4."的錯誤,試試看。
發生什?了?Ok,在記憶體中一個物件(object)與陣列是非常相似的。我們最好還是先看看一個陣列吧。考慮如下的代碼段:
int myIntegerArray[10];
myIntegerArray[0] = 6;
myIntegerArray[1] = 88
當我們?(myIntegerArray[0])的第一個位置賦值時,我們實際上先將編譯器?“myIntegerArray”分配的記憶體位置設?0。再將6移到這個記憶體位置。然後好心的編譯器又分配(保留)了下9個int大小的記憶體單元準備給我們使用。所以,當我們給myIntegerArray[1]賦值88時,我們實際上在myIntegerArray指定的位置增加了sizeof(int)大小,再將88填入。一般的,myIntegerArray[n]可以被認?是myIntegerArray (n*sizeof(int))。
實體(n*sizeof(int))可以(也應該)被想像?一個“偏移”(offset)。
這跟訪問衝突access violations有什?關係呢?
前面'read of address' 的值(000001F4 and 000001F5)是來自EditBox的偏移! 回顧前面的代碼片斷,好心的C Builder自動將EditBox初始化?0。當我們試圖訪問EditBox的一個屬性時,我們實際上在類的基指標上加上了屬性的偏移值(就象前面的陣列一樣)。但此時基指標的值?0!由於00000000 AutoSelect 的偏移(000001F4)不是用戶允許訪問的絕對記憶體地址,我們得到了一個AV。
我們如何依據這些資訊來解決AV?
首先也是最重要的,前面的介紹應該增加了您對各種AV的綜合理解。其次,在AV訊息方塊中提供的資訊可以用來隔離導致問題的高階語言代碼。下面就是詳細的步驟:
1.) 記錄下AV發生的位址。就是前面所講的'(someaddress)'。
2.) 在運行的第一個構造函數處設置中斷點 (工程的主表單main form)。
3.) 運行工程。
4.) 當程式在中斷點處鎖住時按下ctrl-alt-c,彈出CPU窗口。
5.) 在左上角的包含了彙編代碼的區域右擊滑鼠。
6.) 從彈出功能表中選擇'Goto Address'
7.)在彈出窗口的'Enter Address To Position To'處填入'0x(someaddress)'並回車
使用前面的Tedit例子您將會看到:
vcl40.@Stdctrls@TCustomEdit@SetAutoSize$qqr4bool
意義很簡單。我們正處在vcl40模組內並試圖訪問TCustomEdit SetAutoSize 。 現在就可以開始隔離引起AV的罪魁禍首了。只需在TcustomEdit物件中排除啦。由於訪問的是AutoSize屬性。當你找到這些的時候,基本上可以肯定了你已經找到了引起Av的高級代碼了!
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。 得之;我幸。不得;我命。 |
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
|
shinjie
資深會員 發表:12 回覆:275 積分:287 註冊:2003-03-19 發送簡訊給我 |
|
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
|
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
Dear shinjie: The problem is my program need to process 25 files
But it will hang after process 20 or 21 files
it will show " access violation at address 32665A01 in Module 'CC32665A01' I though it may my RAM not enoght
but my PC have 2 GB RAM So it is difficult to to set break poit Thanks
|
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
Dear Sir : Yes the program all hang on the same addreess "32665A01"
it stop at begging of processing 22th files
I worried I didn't have memory release following is my main code //--------------------------------------------------------------------------- #include
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
|
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
|
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
另外在使用strcat,strcpy等函式時,
要"很確定"被寫入的空間的大小是足夠的。
這點就和你讀取的資料有關了,尤其你name的
空間是相連的,一超過範圍一定會出問題的。 另外 strncat( sourceName, source->Text.c_str(), source->Text.Length() ); 上面的語法混合了AnsiString和傳統C的函式...。
AnsiString本身就可以支援相加和指定值。 使用時要不是全用傳統C的和傳統C字串
不然就是全用AnsiString字串和VCL內有的字串處理函式。 "新酒裝在舊皮袋"...不是個好選擇。個人建議
|
PerlC
一般會員 發表:1 回覆:9 積分:2 註冊:2005-02-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |