davidyu720 | 26 五月, 2008 14:33
关键字: HeapAlloc 0xC0000005 Access Violation
对于new/delete,CRT最终调用HeapAlloc/HeapFree来实现。
最近发现一个很早以前开发的程序偶尔会出现奇怪的0xC0000005异常。用drwtsn32日志定位到以前的一个DLL中:该DLL调用了NTDLL的0x7C9305D4处的代码,然后就出现了异常。对该处代码进行分析,发现是HeapAlloc的入口。
用debug版本的DLL运行程序,捕获到异常,stack显示是new调用HeapAlloc时出现异常。看到CRT源码中有#ifdef _MT,感觉跟多线程有关;查DLL工程设置:使用的是单线程运行库。
编写测试程序:多个线程同时new/delete,编译选项为单线程运行库。(因为该编译选项,因此只能用CreateThread创建线程,不能用_beginthread创建)。
在双核CPU上运行程序,立即出现类似的错误;
在单核CPU上运行程序,长时间运行也不出错;
修改编译选项为多线程库,编译,程序在双核CPU上运行正常。
自此问题基本解决。
待解疑问:为何在单核CPU上运行用单线程运行库连接的程序,长时间运行也不出错呢?
it is me | 05/06/2008, 11:52
| « | 八月 2008 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
补:在单核CPU上运行用单线程运行库连接的程序:
1)WinXP: 也会出现HeapAlloc/HeapFree方面的错误;
2)Win2K: 运行1天也没有观察到错误。
看来是WINXP与WIN2K的多线程调度机制有所不同。