遇到相同的问题,虽然没解决我的问题,留着慢慢研究。
一、 首先说明产生这种现实的原因:
操作对象为null或内存地址不存在,非常容易产生这种错误的情况是你的程序采用的多线程技术,线程中有多全局变量操作 见四。要想真正在你的海量程序代码中定位到错误位置,属实是件不易的事情。
二、 那么我们如何解决这个问题呢?本人提出两种方法
1.从代码入手逐段屏蔽代码,后运行看是否产生错误,这样方法对于代码量小的程序比较容易定位,但对于 大量代码的程序定位错误比较困难。
2.windbg 定位错误,那么就要了解windbg的使用方法,这里简单介绍下它的用法和命令。
2.1.启动windbg.exe: 文件-> 打开可执行文件->在0:00>g 运行
2.2. 设置符号文件: 文件->符号文件路径D:\symbol;srv*d:\symbolslocal*http://msdl.microsoft.com/download/symbols
其中D:\symbol;是你启动exe的pdb文件存在路径 d:\symbolslocal是系统dll的pdb下载存放路径http://msdl.microsoft.com/download/symbols是win系统pdb下载地址
当错误发生时:
>uf "错误函数" 这样就可以大概定义错误位置。
3.下面是windbg的常用命令要想更详细的了解查询帮助文档
1. >g 程序执行
1.vertarget命令显示当前进程的大致信息。
2.lmvm命令可以看任意一个dll/EXE的详细信息。
3.lmf可以列出当前进程中加载的所有dll文件和对于的路径
4.dd指定地址
5.ed 地址1 地址2 把地址1 改成 地址2
6.!address命令可以显示某地址页信息
7.s搜索内存 s -u "asdf"
8.~可以显示线程信息与不同线程之间切换
9. u 反汇编某一地址。
10*. uf反汇编整个函数。
11*. kn 查看命令切换到主线程 查看callstack 调用堆代码信息
.frame 行号
x 显示当前这个函数里面的局部变量值
例如
>~0s
>kn
>.frame d
>x
>dt 变量名 显示变量成员信息
11. x 查找某一符号对于的二进制
12. dds 二进制对于符号
13. >bp 函数 "k;.echo 'break';g"
bp设置断点
K显示callstack信息
g继续执行
14. !handle获得整个进程,或者某个handle的详细信息
!htrace 可以获得某一个handle创建时候的call stack
!cs 可以获得一个criticalsection的详细信息
adplus
Adplus -crash -p <pid> -quit -fullonfirst -o c:\dddd
监视进程所有异常
Adplus -crash -p <pid> -quit -nodumponfirst -o c:\dddd
建议采用:
adplus -crash -quiet -o c:\dddd -sc 程序.exe
三、watson 当程序发生异常退出时 把dump保存下来
四、非常容易产生这种错误的情况是你的程序采用的多线程技术 见vc多线程使用不当导致一系列错误