我先介绍一下我的代码的运行环境:
1. 我写了一个DLL,这个DLL的名字是A.DLL,并且我有A.DLL的全部源代码。
2. A.DLL可以被B.EXE加载,可以正常加载,但我没有B.EXE的源代码。现在的问题是:B.EXE偶尔会产生DA问题(即B.EXE偶尔会崩溃),但出错的时机看不出规律,也看不出触发条件,所以,不能采用单步跟踪,可以肯定的是,出错肯定是由A.DLL引起的,现在我要定位问题出在A.DLL中的哪个位置(定位到A.DLL源代码的哪个位置),不知道高手有没有什么好的解决办法?谢谢!

解决方案 »

  1.   

    可以在你怀疑出错的地方监控输出,具体可采用这样的办法,在你怀疑会出错的地方加上一下语句:
    static FILE *fp=fopen("myoutdata.txt","at");
    if(fp)
    {
       fprintf(fp,"%d %f ...\n",para1,para2);
    }其中para1,para2...是你要监控的参数,,"%d %f ...\n"可根据para1,para2...的类型设置我就是这样监控问题的
      

  2.   

    直接用A工程调试执行B工程不就行了,不用加断点,既然你确定是A.dll的问题,死机的时候会断在A工程里面的啊
      

  3.   

    2# devinside 提供的就是最好最简单直接的办法。 不明白的话看看msdn中如何调试dll的文章。
      

  4.   


    改工程设置,executable for debug session
      

  5.   


    你是説debug 没问题release有问题?还是出问题的时候调用堆栈中得不到有用的信息?
      

  6.   

    1、debug状态下让他跑,出错的时候看调用堆栈
    2、打日志的方式,在你认为有可能出现问题的地方打日志,尽量详细
      

  7.   

    如果不是稳定复现,而且时机也不确定的话,个人建议用写log的办法,尽可能详细的在dll里加log信息,然后让它跑。及时调整log信息,进行分析。
    用debug状态运行也可以,但是有时候debug运行和release运行还是有差别的,不一定能找到问题。
      

  8.   


    Debug下出错的时候点击重试,然后看函数堆栈就可以定位到了吧
      

  9.   

    你到网上下载两个文件
    MSJEXHND.CPP,MSJEXHND.h
    把它加入到你的工程中来,它会在程序崩溃时把当前的堆栈信息写入日志的,然后你根据日志中的地址用反汇编工具查找这个地址的大概位置,
    这种方法虽不能100%成功查出问题所在,但也是一种方法,我以前就用这种方法找出了一个BUG,^_^
      

  10.   

    用windbg,抓错误内存映像,然后在自己机器上定位
      

  11.   

    同意2楼的,直接调试A.dll这个工程,然后选择b.exe 这个程序,发生错误的时候就会自动断在A里
      

  12.   

    首先,编译你的DLL时生成MAP及COD文件,并且修改DLL的基址不与其它DLL重复。
    使用上面的信息在程序出错时根据“0xxxxxxxx”代码发生共享违例等类似提示时就可以根据这个地址找到出错的代码。这个只能定位错误,但不能得到错误的信息,最好的办法还是上面的。
      

  13.   


    上面是一种方法,A的源码在你手上,所以你只要不停的使用debug mode 去调试,当死机的时候(如果问题发生在A.Dll的话),重试,看函数栈就能停到出问题的地方。二: 使用DebugStringOutput 在你怀疑有问题的地方,打印Debug信息。如果程序死掉,查看打印信息,再找问题所在。想这种调试不算什么大问题,调试程序多了,应该能很快找出问题。
      

  14.   

    简单点就是日志了。最直接的办法就是用softice调试了,你都有dll源代码,生成符号文件。一跑就解决了。
      

  15.   

    1.打Trace,正如二楼说的方法
    2.生成Map,根据崩溃地址和Map文件定位代码
      

  16.   

    用BoundsChecker或Purify等调试工具试试。
      

  17.   

    A.DLL中每个函数的入口和出口都打上Log;
    然后运行程序时用Dbgview来记录Log,程序崩溃了就去查Log,就能定位了。
      

  18.   

    debug 版本,vc可以调试的。
      

  19.   

    在ide的项目配置里面,把调试程序,设置成b.exe就可以了。然后就可以调试。
      

  20.   

    在DLL工程里设置断点,调试运行DLL工程,链接到B.EXE,即可!
      

  21.   

    drwtsn32 -i 
    先注册,然后他有记录。
      

  22.   

    F5运行DLL程序,指定执行文件为B.EXE。