如何确定程序异常位置

timezone 2009-06-04 09:09:26
请问各位高手,我用VB.NET(vs2008)写的一个程序,其中用到了多线程,用到了外部控件等,程序总是在运行一天左右出现异常,我直接在VS2008里点调试运行也同样出现异常,我的问题是怎么确定这个异常是由哪一段代码引起的,我在每个可能引起异常的地方都写了TRY CATCH,但还是看不到出错的地方,程序异常信息如下:
线程 '<无名称>' (0xcbc) 已退出,返回值为 0 (0x0)。
在 System.AccessViolationException 中第一次偶然出现的“System.Drawing.dll”类型的异常
在 System.AccessViolationException 中第一次偶然出现的“System.Drawing.dll”类型的异常
“bjl.vshost.exe”(托管): 已加载“C:\WINDOWS\assembly\GAC_MSIL\System.Transactions.resources\2.0.0.0_zh-CHS_b77a5c561934e089\System.Transactions.resources.dll”
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>未处理的异常</Description><AppDomain>bjl.vshost.exe</AppDomain><Exception><ExceptionType>System.AccessViolationException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>尝试读取或写入受保护的内存。这通常指示其他内存已损坏。</Message><StackTrace> 在 System.Drawing.SafeNativeMethods.Gdip.IntGdipDisposeImage(HandleRef image)
在 System.Drawing.SafeNativeMethods.Gdip.GdipDisposeImage(HandleRef image)
在 System.Drawing.Image.Dispose(Boolean disposing)
在 System.Drawing.Image.Finalize()</StackTrace><ExceptionString>System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
在 System.Drawing.SafeNativeMethods.Gdip.IntGdipDisposeImage(HandleRef image)
在 System.Drawing.SafeNativeMethods.Gdip.GdipDisposeImage(HandleRef image)
在 System.Drawing.Image.Dispose(Boolean disposing)
在 System.Drawing.Image.Finalize()</ExceptionString></Exception></TraceRecord>
未处理的“System.AccessViolationException”类型的异常出现在 System.Drawing.dll 中。

其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
...全文
1533 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fankuilong 2010-07-06
  • 打赏
  • 举报
回复
upupupupup
V68V6 2009-06-12
  • 打赏
  • 举报
回复
JF
langziqian 2009-06-09
  • 打赏
  • 举报
回复
学习
hxd209 2009-06-09
  • 打赏
  • 举报
回复
VB.net2008好找啊.下而就有错误提示.双击就出来是在哪点出错了.
阿泰 2009-06-08
  • 打赏
  • 举报
回复
代码模式下,按下Ctrl+Alt+E
弹出来的界面上,根据需要打上勾。
如果全勾上,基本上所有的错误都能捕获到了
moonshineidolon 2009-06-08
  • 打赏
  • 举报
回复
保存日志吧 没有啥好办法,要不就是跟踪调试
timezone 2009-06-08
  • 打赏
  • 举报
回复
还是回到题目上来,请教各位高手,程序异常退出,没有任何提示。我在程序事件了设置了捕捉unhandleedexception来写错误日志,也没有发现任何错误,请教高手,这大概是什么原因让程序捕捉不到异常退出的原因呢?我在程序中调用 了外部的DLL,如果DLL异常,程序能不能捕捉到异常信息?
timezone 2009-06-07
  • 打赏
  • 举报
回复
我做的是一个游戏 的画面,需要不断的更新用户界面 ,请问有没有好的办法解决使用多个线程的委托导致程序变慢的问题?
[Quote=引用 8 楼 hztltgg 的回复:]
不知道你的代码是什么功能,个人认为线程不应该去频繁更新界面,线程可以去更新相关变量,由界面自己觉定什么时候更新界面
[/Quote]
hztltgg 2009-06-07
  • 打赏
  • 举报
回复
游戏有游戏的框架呀,显示有专门的线程,托管directx,xna,如果用cgi+,也应该是显示独立的,在显示线程中只管显示数据,动作引起的变化只是修改数据。
oo渣渣oo 2009-06-05
  • 打赏
  • 举报
回复
在你怀疑出错的多线程过程里加上STOP语句来暂停程序运行,达到进入调试的目的
hztltgg 2009-06-05
  • 打赏
  • 举报
回复
在调试阶段,加了trycatch是不能发现异常的具体地点,不过也不用去掉try吧,不然发布的时候又加上?太麻烦了

在vs2008里,打开项目,菜单里的调试-》异常-》在common language runtime exceptions 的引发上打个沟就能中断了
bwangel 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hztltgg 的回复:]
在调试阶段,加了trycatch是不能发现异常的具体地点,不过也不用去掉try吧,不然发布的时候又加上?太麻烦了

在vs2008里,打开项目,菜单里的调试-》异常-》在common language runtime exceptions 的引发上打个沟就能中断了
[/Quote]
说得有道理.

我还没有发现这个技巧.
hztltgg 2009-06-05
  • 打赏
  • 举报
回复
不知道你的代码是什么功能,个人认为线程不应该去频繁更新界面,线程可以去更新相关变量,由界面自己觉定什么时候更新界面
CloneCenter 2009-06-05
  • 打赏
  • 举报
回复
看堆栈中的调用过程,看看错误的时候 Exception.Stack 应该就可以了。
timezone 2009-06-05
  • 打赏
  • 举报
回复
各位高手,我大概找到程序异常的原因了。是因为我在多线程ABCDK等线程中操作UI没有使用委托,而直接用 Me.CheckForIllegalCrossThreadCalls = False,我将它改成了委托。同时问题又来了。因为我是多个线程操作FORM1上的多个元素,使用委托让程序界面一下变得很慢起来,请问有没有什么好的办法解决这个问题呢?
V68V6 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bwangel 的回复:]
在调试阶段,加了trycatch恰恰是不能发现异常的具体地点.


所以我还是建议:在调试阶段,不要给程序套上TryCatch的安全套, 就让程序"裸奔",黄屏,通过出错信息反而可以轻易发现程序到底哪里出了问题.

另外,多线程的程序在调试时,首先要在单线程下调试通过.如果单线程都通不过,多线程出了问题更不知道问题在哪了.
[/Quote]

说的有道理
定位异常位置你可以尝试在程序中间插入一些Messagebox代码段,MSG的内容你自己定。然后在每个MSG代码位置设一个断点,再调试。如果message能够跳出来说明你添加的这个message代码之前的代码没报异常。就这样慢慢的把有问题的地方给夹出来了。
enihs 2009-06-04
  • 打赏
  • 举报
回复
在vs环境中运行这个程序一天,出错会跳到出错的位置...
bwangel 2009-06-04
  • 打赏
  • 举报
回复
在调试阶段,加了trycatch恰恰是不能发现异常的具体地点.


所以我还是建议:在调试阶段,不要给程序套上TryCatch的安全套, 就让程序"裸奔",黄屏,通过出错信息反而可以轻易发现程序到底哪里出了问题.

另外,多线程的程序在调试时,首先要在单线程下调试通过.如果单线程都通不过,多线程出了问题更不知道问题在哪了.

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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