acad.exe 中的 0x25c70fc2 (???.arx) 处最可能的异常: 0xC0000005: 读取位置 0x0000009c 时发生访问冲突
1. ?
修改了一個以前的arx程序,編譯通過后,加載時出錯,acad說它不是合法arx文件。但是因為還沒走到DllMain(),所以vc也調(diào)試不了,不知道那里出錯,毫無頭緒。睡了一覺,覺得應該是全局變量或者類的靜態(tài)成員初始化時出錯。
到網(wǎng)上搜了一下,有篇文章還行:http://blog.csdn.net/xingzihe/article/details/9032789,為閱讀方便,部分內(nèi)容轉(zhuǎn)帖如下:
Windows 進程一般放在 0x00400000 的地址,0x00400000 是所有版本的 Windows 能使用的最低地址,進程實例句柄的值總是和它的基地址相同,所有未被初始化的自動變量都會設上 0xCCCCCCCC。數(shù)值類似0xC0000005等,通常是debug模式下的未附值的指針(未初始化)。
稍微筆記一下上文:
0x00400000=4M=4x1024x1024=4x1048576=4194304, 1K=1024=0x400, 1M=1024x1024=0x100000
0xCCCCCCCC=0b11001100110011001100110011001100=3435973836
0xC0000005 =0b11000000000000000000000000000101=3221225477
和我的感覺一樣,應該是指針越界訪問或指針未初始化就使用這樣的問題。最后果然是全局變量初始化順序的問題,一個全局變量的初始化依賴了另一個全局變量的初始化,而c/c++中,不同編譯單元的全局量的初始化順序是沒有保證的。稍作修改,果然重新運行起來了!
另外,初始化全局變量處也是可以下斷點的。
折騰了好久,發(fā)現(xiàn)沒有調(diào)試器的幫助,自己的腦子都僵住了,幾乎不會解決問題了,哈
2. ?
新建了一個空的arx工程,編譯加載都正常,屬性 | 鏈接器 | 輸入 | 附加依賴項 ?中加入了以前的一個arx的lib(并沒有用到其中導出的變量或函數(shù)),編譯通過但是加載不了了。
說是:???.arx 與此版本的 AutoCAD 不兼容。AcRxDynamicLinker加載"???.arx"失敗。
研究了2天,是依賴的某個dll沒找到?是某個調(diào)用的arx不兼容,是需要對某個arx使用linker delayload?等等。偶然發(fā)現(xiàn),以前一個工程也是依賴了這個arx,一看,那兒是用了#pragma comment(lib, "???.lib"), 不是在工程的屬性中設置在附加依賴項中。改用#pragma comment(lib, ...)果然成功加載。這兩種引入庫的方式有什么區(qū)別?不知道。
也有可能用附加依賴項的方式不行,是因為引入的這個.arx庫不是用最兼容的vs版本編譯的(vc2010, acad2012),沒試驗驗證過是否如此。
3. ?
向一個arx工程中加入了一個類,編譯通過,加載時說:
???.arx 無法找到所需的動態(tài)鏈接庫或其他文件。
英文是:???.arx cannot find a dll or other file that it needs.
費了半天勁,確認所有用到的庫中,除了windows和vc, win sdk自帶的,都放在該???.arx同一個目錄中了,應該不存在缺少dll或路徑找不到的問題。有目的、無目的的修改、編譯,加載,這種盲目的嘗試了1天多。后來沒什么招了,忽地想起網(wǎng)上看到有一個帖子說,用windbg能看到更多的信息,也不太抱希望,因為感覺又不是無源代碼調(diào)試,vc的調(diào)試器,不會比windbg少什么信息。但是既然是盲目地試,也不在乎在試一下。用windbg環(huán)境下附加到acad.exe,加載???.arx居然成功了。這下知道基本上是因為acad.exe沒找到???.arx所在目錄下的另一個所依賴的arx。在acad的支持路徑下加入該???.arx所在目錄,果然加載成功。
奇怪的是,所有的dll和arx(除了windows和vc,win sdk自帶的庫)都放在一個目錄下,而且之前加載其它dll時(都在與???.arx同一個目錄下,沒有子目錄)也沒有指定acad的支持文件路徑,都加載成功了。這些都只有詳細地了解了acad加載庫的過程和搜尋庫的規(guī)則才能徹底明白。
實驗了一下,帶/b “xxx.scr”參數(shù)啟動acad.exe會不認arx所在的目錄。把該目錄加到acad的支持路徑或者os的環(huán)境變量path,或者當作快捷方式的起始位置都可以。
不帶/b參數(shù),空參數(shù)啟動acad.exe,手動arx加載各arx也能成功。
總結(jié)
以上是生活随笔為你收集整理的acad.exe 中的 0x25c70fc2 (???.arx) 处最可能的异常: 0xC0000005: 读取位置 0x0000009c 时发生访问冲突的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [BZOJ4349]最小树形图
- 下一篇: Visio2016绘制框图的基本操作方法