全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4834
推到 Plurk!
推到 Facebook!

Access Violation at address 32665A01 in Module 'CC

尚未結案
PerlC
一般會員


發表:1
回覆:9
積分:2
註冊:2005-02-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-03 14:06:46 IP:211.23.xxx.xxx 未訂閱
My OS is XP SP2 env is borland builder 6 I did check Prev question have similar question but the different is not read the address 000000 is F9628F44 Any expert can help me out? Thanks you very much! perlc
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-03 14:26:42 IP:203.73.xxx.xxx 未訂閱
以下是轉貼的資料來自於: 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-03 19:03:13 IP:211.23.xxx.xxx 未訂閱
could you make example for this sentence? 在運行的第一個構造函數處設置中斷點 (工程的主表單main form)。 Thank you ver.........y Mu.........ch
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-04 08:51:05 IP:203.73.xxx.xxx 未訂閱
在運行的第一個構造函數處設置中斷點 (工程的主表單main form)。 只是要你隨便找個地方設定中斷點就可以了。(可以設在你認為會出錯的地方) 最主要的是下面這個動作 當程式在中斷點處鎖住時按下ctrl-alt-c,彈出CPU窗口。
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
PerlC
一般會員


發表:1
回覆:9
積分:2
註冊:2005-02-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-04 09:28:38 IP:211.23.xxx.xxx 未訂閱
How to 設定中斷點?    Thanks
PerlC
一般會員


發表:1
回覆:9
積分:2
註冊:2005-02-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-04 18:42:58 IP:211.23.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-04 19:07:26 IP:211.23.xxx.xxx 未訂閱
Hi! Shinjie: I follow your direction found the message 0x32665A01 "cmp dword ptr [ eax ebx*4],0x00" only I knew is ptr is one of my strcuct What action should I take? thanks
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-07 01:45:47 IP:211.76.xxx.xxx 未訂閱
PerlC你好: CC32665A01這個Module是管理動態記憶體用的(如果我沒記錯的話)。 會發生這個問題可能是你程式中有memory處理的bug, 建議可以先檢查是不是重復delete了同一個pointer。 不然也可以放上程式碼讓大家一起來找bug。
PerlC
一般會員


發表:1
回覆:9
積分:2
註冊:2005-02-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-02-07 14:46:08 IP:211.23.xxx.xxx 未訂閱
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  #include #include #pragma hdrstop #include "main.h" #define SAFEDELETE_ARRAY(wfp) if((wfp)) { delete (wfp); wfp = NULL; } /// extern void convert(FILE *wfp); FILE *fp; //unsigned int type=0; unsigned char Lot_Name[3]={0}; TSearchRec sr; AnsiString FILE_NAME[100]; int RowCount=0; //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::btnRechargeClick(TObject *Sender) { FILE *wfp; unsigned char name[5][16]={0},sourceName[64]={0}; Memo1->Clear(); while( RowCount > 0 ){ source->Text = ExtractFileName(FILE_NAME[--RowCount]).c_str(); memset( sourceName, 0, 80 ); memset( name[0], 0, 90 ); // i = 0; // j = 0; // k = 0; edtValue->Clear(); edtValue->Font->Color = clRed; edtValue->Text = "Wait a moment !!"; // Memo1->Clear(); Form1->Refresh(); char str2[] = ".mg.v4"; edtValue->Font->Color = clGreen; // type= 0; if( (fp = fopen(source->Text.c_str(), "rb")) != NULL ) { } else { Application->MessageBox("Open File Failed", "Error", MB_OK|MB_ICONERROR); } strncat( sourceName, source->Text.c_str(), source->Text.Length() ); //return; //strncat( source->Text.c_str(), sourceName, i ); strcpy( source->Text.c_str(), sourceName ); // strcpy( sourceName , source01->Text.c_str()); //edtValue->Text = sourceName; strcat( sourceName,str2); if( (wfp = fopen( sourceName, "wb" ))== NULL ){ Application->MessageBox("Open File Failed", "Error", MB_OK|MB_ICONERROR); } convert(wfp); } //source->Text = edtValue->Text; //edtValue->Text = "transfer to bitmap successfully"; } //--------------------------------------------------------------------------- void __fastcall TForm1::btnCheckClick(TObject *Sender) { char str[100]; int i, j, length; bool init; OpenDialog1->DefaultExt = "v4"; OpenDialog1->FileName = "*.v4"; //OpenDialog1->InitialDir = "C:"; OpenDialog1->InitialDir = "F:\200501-checkPRT\STDF_Check"; if( OpenDialog1->Execute() ) { source->Text = ExtractFileName(OpenDialog1->FileName).c_str(); if (FindFirst("*.v4", 0x40, sr) == 0) { do { { FILE_NAME[RowCount ] = sr.Name.c_str(); } } while (FindNext(sr) == 0); FindClose(sr); } } } //---------------------------------------------------------------------------
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-02-07 15:24:52 IP:211.76.xxx.xxx 未訂閱
memset的使用有些問題 memset( sourceName, 0, 80 ); // sourceName只有64 byte memset( name[0], 0, 90 ); // name總共只有 80 byte
PerlC
一般會員


發表:1
回覆:9
積分:2
註冊:2005-02-03

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-02-07 16:19:29 IP:211.23.xxx.xxx 未訂閱
You are right! I did change it 64 and 80 is correct one.
PerlC
一般會員


發表:1
回覆:9
積分:2
註冊:2005-02-03

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-02-07 16:20:07 IP:211.23.xxx.xxx 未訂閱
You are right! I did change it 64 and 80 is correct one. Thanks again
PerlC
一般會員


發表:1
回覆:9
積分:2
註冊:2005-02-03

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-02-07 17:28:16 IP:211.23.xxx.xxx 未訂閱
Dear Sir: but it is not major issue. I update it then run the program the error still the same
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-02-08 02:59:16 IP:211.76.xxx.xxx 未訂閱
另外在使用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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-02-14 11:40:03 IP:211.23.xxx.xxx 未訂閱
Dear Sir: could you show a sampe of Ansi.sting to replace follow code? strncat( sourceName, source->Text.c_str(), source->Text.Length() ); Thanks and Happy new year!
系統時間:2024-05-14 3:56:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!