acad.exe 中的 0x25c70fc2 (???.arx) 处最可能的异常: 0xC0000005: 读取位置 0x0000009c 时发生访问冲突

1.  

修改了一个以前的arx程序,编译通过后,加载时出错,acad说它不是合法arx文件。但是因为还没走到DllMain(),所以vc也调试不了,不知道那里出错,毫无头绪。睡了一觉,觉得应该是全局变量或者类的静态成员初始化时出错。

到网上搜了一下,有篇文章还行:http://blog.csdn.net/xingzihe/article/details/9032789,为阅读方便,部分内容转帖如下:

Windows 进程一般放在 0x00400000 的地址,0x00400000 是所有版本的 Windows 能使用的最低地址,进程实例句柄的值总是和它的基地址相同,所有未被初始化的自动变量都会设上 0xCCCCCCCC。数值类似0xC0000005等,通常是debug模式下的未附值的指针(未初始化)。

稍微笔记一下上文:

0x00400000=4M=4x1024x1024=4x1048576=4194304, 1K=1024=0x400, 1M=1024x1024=0x100000

0xCCCCCCCC=0b11001100110011001100110011001100=3435973836
0xC0000005 =0b11000000000000000000000000000101=3221225477


和我的感觉一样,应该是指针越界访问或指针未初始化就使用这样的问题。最后果然是全局变量初始化顺序的问题,一个全局变量的初始化依赖了另一个全局变量的初始化,而c/c++中,不同编译单元的全局量的初始化顺序是没有保证的。稍作修改,果然重新运行起来了!

另外,初始化全局变量处也是可以下断点的。

折腾了好久,发现没有调试器的帮助,自己的脑子都僵住了,几乎不会解决问题了,哈

2.  

新建了一个空的arx工程,编译加载都正常,属性 | 链接器 | 输入 | 附加依赖项  中加入了以前的一个arx的lib(并没有用到其中导出的变量或函数),编译通过但是加载不了了。

说是:???.arx 与此版本的 AutoCAD 不兼容。AcRxDynamicLinker加载"???.arx"失败。

研究了2天,是依赖的某个dll没找到?是某个调用的arx不兼容,是需要对某个arx使用linker delayload?等等。偶然发现,以前一个工程也是依赖了这个arx,一看,那儿是用了#pragma comment(lib, "???.lib"), 不是在工程的属性中设置在附加依赖项中。改用#pragma comment(lib, ...)果然成功加载。这两种引入库的方式有什么区别?不知道。

也有可能用附加依赖项的方式不行,是因为引入的这个.arx库不是用最兼容的vs版本编译的(vc2010, acad2012),没试验验证过是否如此。

3.  

向一个arx工程中加入了一个类,编译通过,加载时说:

???.arx 无法找到所需的动态链接库或其他文件。
英文是:???.arx cannot find a dll or other file that it needs.

费了半天劲,确认所有用到的库中,除了windows和vc, win sdk自带的,都放在该???.arx同一个目录中了,应该不存在缺少dll或路径找不到的问题。有目的、无目的的修改、编译,加载,这种盲目的尝试了1天多。后来没什么招了,忽地想起网上看到有一个帖子说,用windbg能看到更多的信息,也不太抱希望,因为感觉又不是无源代码调试,vc的调试器,不会比windbg少什么信息。但是既然是盲目地试,也不在乎在试一下。用windbg环境下附加到acad.exe,加载???.arx居然成功了。这下知道基本上是因为acad.exe没找到???.arx所在目录下的另一个所依赖的arx。在acad的支持路径下加入该???.arx所在目录,果然加载成功。

奇怪的是,所有的dll和arx(除了windows和vc,win sdk自带的库)都放在一个目录下,而且之前加载其它dll时(都在与???.arx同一个目录下,没有子目录)也没有指定acad的支持文件路径,都加载成功了。这些都只有详细地了解了acad加载库的过程和搜寻库的规则才能彻底明白。

实验了一下,带/b “xxx.scr”参数启动acad.exe会不认arx所在的目录。把该目录加到acad的支持路径或者os的环境变量path,或者当作快捷方式的起始位置都可以。

不带/b参数,空参数启动acad.exe,手动arx加载各arx也能成功。



猜你喜欢

转载自blog.csdn.net/thinktalk/article/details/74279715