我创建了一个程序,它在Visual Studio 2010中使用事件(SetEvent()
,WaitForSingleObject()
,WaitForMultipleObjects()
)同步运行2个线程。发生以下情况:
当我使用调试器运行此程序时,它会运行一段时间然后崩溃
当我在没有调试(.exe文件)的情况下运行此程序时,它直接崩溃
当我使用调试器在另一台计算机上运行此程序时,它立即崩溃并通过.exe文件在一段时间后崩溃
调试时报告了以下错误:
Unhandled exception at 0x5eafcaf7 (msvcr100d.dll) in test.exe: 0xC0000005: Access violation reading location 0x0036f000.
有人可以为这个话题带来一些启示,因为我不知道从哪里开始搜索?在调试器中运行代码或没有代码之间的区别是什么? (添加了哪种代码?)为什么不同的计算机在运行相同的代码时会有不同的行为?
在两台计算机上都有完全相同的操作系统(Windows 7),我假设相同的库和补丁。
感谢您的帮助!
编辑11.12.2012
我已经安装了应用程序验证程序,并在Visual Studio中显示了一些错误:
===========================================================
VERIFIER STOP 0000000000000013: pid 0x1E18: first chance access violation for
current stack trace
000000000874F000 : Invalid address being accessed
000000005201CAF7 : Code performing invalid access
000000000009E440 : Exception record. Use .exr to display it.
000000000009DF50 : Context record. Use .cxr to display it.
===========================================================
有人知道我怎么知道哪个地址属于哪行代码才能准确知道异常发生的位置?我还在程序的帮助中读到,使用命令“!heap p -a ACCESS_ADDRESS”应该提供有关错误性质和溢出的堆块的详细信息。我应该在哪里使用Visual Studio放置此命令?
答案 0 :(得分:1)
在多线程环境中工作时,事情可能会在不同线程上以不同的速度发生。试图在没有相关代码的情况下确定可能的原因是非常困难的。
错误是一般的内存访问冲突错误。当从函数返回的变量大于预期或不同类型时,通常会发生这种情况。
我们能看到代码吗?