Release版本的调试???

jxb_memory 2011-03-13 02:18:35
程序是由多文档主程序和若干DLL组成的,现在Release版在切换视图时会出现异常,但是Debug下却不会,我尝试给Release添加Program Database (/Zi)之类的调试信息进行调试,可是只要按F5执行程序就没问题,而只要双击直接运行程序就会在切换视图时崩溃。崩溃的地址是0x003401c4,我想通过Map文件查找崩溃位置,可是发现主程序的起始地址是00400000,而所有DLL的起始地址是10000000,似乎也没有包含0x003401c4的,我该怎么办?谁知道如何调试?
...全文
162 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
野男孩 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jxb_memory 的回复:]
我又好多DLL,是不是所有的DLL都要去掉优化选项?
如何确认在崩溃发生时,各个DLL的实际加载地址?确认后又如何计算崩溃行地址?
[/Quote]

不用。出错的时候会弹窗啊,这时候attach上去,看看各个模块(exe和dll)的地址(调试器都能看到的),基本上就能判断出是在哪个DLL里面。

然后再对这个dll处理吧。
jxb_memory 2011-03-14
  • 打赏
  • 举报
回复
我又好多DLL,是不是所有的DLL都要去掉优化选项?
如何确认在崩溃发生时,各个DLL的实际加载地址?确认后又如何计算崩溃行地址?
[Quote=引用 8 楼 coding_hello 的回复:]
只修改C/C++的设置Program Database (/Zi)还不行,还得在Link的属性里勾上调试信息的选项。
另外,把优化的选项改掉,用default就行了。



崩溃的地址是0x003401c4,我想通过Map文件查找崩溃位置,可是发现主程序的起始地址是00400000,而所有DLL的起始地址是10000000,似乎也没有包含0x003401c4的,我该怎么办?谁知道如何调试……
[/Quote]
验证码识别 2011-03-14
  • 打赏
  • 举报
回复
关键是调试时根本不出问题,即使是Release版本调试也不出问题,只有不调试时才出问题,怎么办?
-------------------------------
明显的时间问题

调试时(设置断点)时间充足, 其他线程有足够的时间完成某个任务

非调试(无断点)状态下, 某个线程把某个资源释放掉了, 而其他线程还要用这个

这种情况异常也可能发生在系统函数内部, 比如waiteevent??函数,执行时事件句柄存在,但这个函数没执行完的时候其他线程做释放事件句柄的操作
向立天 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jxb_memory 的回复:]

我基本上可以确定是那个库,可是那个库本身也很庞大,关键是调试时根本不出问题,即使是Release版本调试也不出问题,只有不调试时才出问题,怎么办?
[/Quote]不调试的时候出问题?
会不会和访问路径有关
Allen_zhang 2011-03-14
  • 打赏
  • 举报
回复
release也可以调试的。具体方法网上查一下就知道了

或者,编译的时候生成pdb文件,用windbg调试一下
傻X 2011-03-14
  • 打赏
  • 举报
回复
应该是优化问题.
zhanshen2891 2011-03-14
  • 打赏
  • 举报
回复
你把你的VC设置成实时调试器啊,它一崩溃你就附加上去不就定位到出错的地方了么。

另外,从你说的这个现象来看,基本上就是由于 有未初始化的变量造成的。
Eleven 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jxb_memory 的回复:]
我基本上可以确定是那个库,可是那个库本身也很庞大,关键是调试时根本不出问题,即使是Release版本调试也不出问题,只有不调试时才出问题,怎么办?
[/Quote]
打log吧来一一排查~
验证码识别 2011-03-14
  • 打赏
  • 举报
回复
调试状态, 异常发生后看堆栈信息
野男孩 2011-03-14
  • 打赏
  • 举报
回复
只修改C/C++的设置Program Database (/Zi)还不行,还得在Link的属性里勾上调试信息的选项。
另外,把优化的选项改掉,用default就行了。



崩溃的地址是0x003401c4,我想通过Map文件查找崩溃位置,可是发现主程序的起始地址是00400000,而所有DLL的起始地址是10000000,似乎也没有包含0x003401c4的,我该怎么办?谁知道如何调试?

关于这一个,要知道DLL的起始地址是默认都是0x10000000,但实际上显然不可能所有的DLL都加载到这个地址上。PELoader会动态修正加载的地址。所以你需要确认在崩溃发生时,各个DLL的实际加载地址。
yuohoo 2011-03-13
  • 打赏
  • 举报
回复
用输出或者日志看吧
jxb_memory 2011-03-13
  • 打赏
  • 举报
回复
我基本上可以确定是那个库,可是那个库本身也很庞大,关键是调试时根本不出问题,即使是Release版本调试也不出问题,只有不调试时才出问题,怎么办?
向立天 2011-03-13
  • 打赏
  • 举报
回复
在可能出问题的地方输出一些运行日志看看会不会有助于定位问题
jxb_memory 2011-03-13
  • 打赏
  • 举报
回复
请问如何在这个地址设置断点?
[Quote=引用 3 楼 wuhuwy 的回复:]
看出错地址应该是你调用动态库时候出了问题,你调试时在这个地址设个断点,看看是哪个库,然后再进一步定位错误
[/Quote]
wuhuwy 2011-03-13
  • 打赏
  • 举报
回复
看出错地址应该是你调用动态库时候出了问题,你调试时在这个地址设个断点,看看是哪个库,然后再进一步定位错误
jxb_memory 2011-03-13
  • 打赏
  • 举报
回复
问题是程序很大,无从看起啊?
[Quote=引用 1 楼 dream238 的回复:]
Release编译时关闭优化选项,生成PDB调试文件信息,就可以了。
看你的问题描述,一般是指针使用时出问题了,可以看看有无初始化以及使用时的有效性。
[/Quote]
ArcRain 2011-03-13
  • 打赏
  • 举报
回复
Release编译时关闭优化选项,生成PDB调试文件信息,就可以了。
看你的问题描述,一般是指针使用时出问题了,可以看看有无初始化以及使用时的有效性。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧