程序出现Access violation - code c0000005 (first chance)的解决方法

来源:互联网 发布:vscode react 编辑:程序博客网 时间:2024/06/06 01:13

遇到相同的问题,虽然没解决我的问题,留着慢慢研究。

一、 首先说明产生这种现实的原因:
  
  操作对象为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多线程使用不当导致一系列错误     

0 0
原创粉丝点击