我先介绍一下我的代码的运行环境:
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. 我写了一个DLL,这个DLL的名字是A.DLL,并且我有A.DLL的全部源代码。
2. A.DLL可以被B.EXE加载,可以正常加载,但我没有B.EXE的源代码。现在的问题是:B.EXE偶尔会产生DA问题(即B.EXE偶尔会崩溃),但出错的时机看不出规律,也看不出触发条件,所以,不能采用单步跟踪,可以肯定的是,出错肯定是由A.DLL引起的,现在我要定位问题出在A.DLL中的哪个位置(定位到A.DLL源代码的哪个位置),不知道高手有没有什么好的解决办法?谢谢!
static FILE *fp=fopen("myoutdata.txt","at");
if(fp)
{
fprintf(fp,"%d %f ...\n",para1,para2);
}其中para1,para2...是你要监控的参数,,"%d %f ...\n"可根据para1,para2...的类型设置我就是这样监控问题的
改工程设置,executable for debug session
你是説debug 没问题release有问题?还是出问题的时候调用堆栈中得不到有用的信息?
2、打日志的方式,在你认为有可能出现问题的地方打日志,尽量详细
用debug状态运行也可以,但是有时候debug运行和release运行还是有差别的,不一定能找到问题。
Debug下出错的时候点击重试,然后看函数堆栈就可以定位到了吧
MSJEXHND.CPP,MSJEXHND.h
把它加入到你的工程中来,它会在程序崩溃时把当前的堆栈信息写入日志的,然后你根据日志中的地址用反汇编工具查找这个地址的大概位置,
这种方法虽不能100%成功查出问题所在,但也是一种方法,我以前就用这种方法找出了一个BUG,^_^
使用上面的信息在程序出错时根据“0xxxxxxxx”代码发生共享违例等类似提示时就可以根据这个地址找到出错的代码。这个只能定位错误,但不能得到错误的信息,最好的办法还是上面的。
上面是一种方法,A的源码在你手上,所以你只要不停的使用debug mode 去调试,当死机的时候(如果问题发生在A.Dll的话),重试,看函数栈就能停到出问题的地方。二: 使用DebugStringOutput 在你怀疑有问题的地方,打印Debug信息。如果程序死掉,查看打印信息,再找问题所在。想这种调试不算什么大问题,调试程序多了,应该能很快找出问题。
2.生成Map,根据崩溃地址和Map文件定位代码
然后运行程序时用Dbgview来记录Log,程序崩溃了就去查Log,就能定位了。
先注册,然后他有记录。