怎样定位哪个DLL的哪行代码出错?

cczlp 2007-03-30 08:28:13
程序调用我的三个DLL, DLL都是VC写的, 运行一些时候会出现非法访问错误. 出现时间不确定.
最后这次的错误是:
"0x02862dcc指令引用的0x0210601f内存. 该内存不能为read"
这三个DLL我都生成了mapfile, 函数最大地址就是10009458,根本没到0x02XXXXXX这么大的地址.

有什么办法知道哪个DLL出错的, 错在哪行吗?
...全文
410 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
__________________ 2007-03-30
  • 打赏
  • 举报
回复
将所有dll与exe输出到一个目录中。
将所有dll与exe组成一个solution
debug版运行
cczlp 2007-03-30
  • 打赏
  • 举报
回复
to rageliu:
可以通过进程分析工具获得DLL的加载地址. 这样是不就可以在Map文件中定位了?
cczlp 2007-03-30
  • 打赏
  • 举报
回复
看来只好用日志了.
to ccrun:
我用VC写的DLL, 所以跑到这来了
tszzp 2007-03-30
  • 打赏
  • 举报
回复
在VC的调试环境中,在Debug的Module菜单里面有各个Module的Address,那样你就知道是那个Module的问题了,不过如果地址是在系统的Module里的话,就不太好分析了,那可能是你少调用了什么,或者什么没有初始化等问题了。
ccrun.com 2007-03-30
  • 打赏
  • 举报
回复
cczlp跑这来了啊。
将日志输出到文件,然后再分析Log文件吧。
raymonzhao 2007-03-30
  • 打赏
  • 举报
回复
我想只有在关键的地方写日志的方式来检查了.哎,环境不对,真是麻烦.
rageliu 2007-03-30
  • 打赏
  • 举报
回复
当然到不了0x02XXXXXX,mapefile只有代码节的东东,关键是还没有重定向.按道理这里就是你dll里面出了问题.可是为什么是0x02xxxxx呢?????那是因为dll被重定向了,当然地址会发生变化.

可以用DebugBreak??

这里还是推荐使用od,不过由于错误出现时间不确定,还是比较麻烦.

也可以使用日志文件配合处理
neil_cn 2007-03-30
  • 打赏
  • 举报
回复
bug几乎很少会在开发机上出现,但是测试机上才是真实的生产环境之一,建议你找合适的位置做一定的日志输出,然后在测试机上跑吧,至少能定位到出现问题的流程入口
jjkezl 2007-03-30
  • 打赏
  • 举报
回复
是不是与调用顺序有关
东文-桑晨 2007-03-30
  • 打赏
  • 举报
回复
可能是越界的问题
cczlp 2007-03-30
  • 打赏
  • 举报
回复
不一定什么时候出现错误, 在我机器上从来就没有出现错误. 在测试机器上
运行几个小时就可能出错. 估计是数组访问越界.但三个DLL都是计算的,
检查代码工作量太大了.
CathySun118 2007-03-30
  • 打赏
  • 举报
回复
把你调用dll的程序编译成exe文件,然后用dll的debug调试,用dll启动exe程序,一个一个的调,这样肯定能发现问题。要不就多些记录文件。
拿节 2007-03-30
  • 打赏
  • 举报
回复
不怎么清楚1
帮顶下!
bomdy 2007-03-30
  • 打赏
  • 举报
回复
设置运行机器的默认调试器为DrWatson,运行
C:\>drwtsn32 -i

程序出异常时,DrWatson会对异常进程生成dump文件user.dmp和drwtsn32.log,存放在
C:\Documents and Settings\All Users\Documents\DrWatson中,把user.dmp拷回开发机

运行WinDebug,设置Symbol file path,
SRV*C:\Program Files\WinDbg\symbol*http://msdl.microsoft.com/download/symbols
加入你的程序的Debug路径,用';'分隔,例如:
E:\MyPrograms\Test\Debug;SRV*C:\Program Files\WinDbg\symbol*http://msdl.microsoft.com/download/symbols

用Open Crash Dump打开user.dmp文件,WinDebug进入调试模式,一般当前就停在出错指令位置,你也可以在下面的命令框中用~#s切换到出错线程,然后打开函数调用栈View->CallStack,其中列出了该线程当前的函数调用情况,从下向上是调用嵌套顺序,最上一个就是出错的地方

找到最后一个你写的函数,双击它,将会自动打开你的源代码文件,并定位到出错行的下一行。

注意:要保证代码与错误程序是相同版本
lzf8977 2007-03-30
  • 打赏
  • 举报
回复
调试呀,用WinDebug

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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