2011-08-29 161 views
3

我正在使用一个大的闭源框架。我最近添加了一个新实体,现在我在执行某些操作时遇到访问冲突。但是,它们发生在框架内的调用上,所以我不知道我执行的是错误的,因为我没有收到调用堆栈。调试访问冲突

在CRT文件tidtable.c中定义的函数_CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue()中报告违规。具体的行是PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE;。我不确定,但我认为它与函数指针有关?

错误消息是Unhandled exception at 0x0000007a in fmwk.exe: 0xC0000005: Access violation reading location 0x0000007a.。我的解释是,它试图访问偏移量为0x7a的东西到一个对象中,但它被激活了一个空指针。它是否正确?如果是这样,有没有办法找到那个偏移量对应的东西?

下面是调用堆栈:

0000007a() 
fmwk.dll!100f2630()  
[Frames below may be incorrect and/or missing, no symbols loaded for fmwk.dll] 

<lots of framework and windows dlls> 

fmwk.exe!00402ef4()  
msvcr100.dll!__set_flsgetvalue() Line 145 + 0xc bytes C 
msvcr100.dll!_getptd_noexit() Line 498 + 0x7 bytes C 
msvcr100.dll!_getptd() Line 523 + 0x5 bytes C 
msvcr100.dll!_LocaleUpdate::_LocaleUpdate(localeinfo_struct * plocinfo=0x00000000) Line 243 + 0x5 bytes C++ 
msvcr100.dll!x_ismbbtype_l(localeinfo_struct * plocinfo=0x00000000, unsigned int tst=0, int cmask=1386664, int kmask=1414714) Line 219 C++ 
msvcr100.dll!_ismbblead(unsigned int tst=0) Line 172 + 0xe bytes C++ 
fmwk.exe!004010a0()  
fmwk.exe!00404d61()  
kernel32.dll!7c817077()  
+0

也许这是[运行时库](http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx)不匹配,因为它看起来像代码试图访问不存在的线程本地存储(尽管我可能会误读堆栈跟踪错误)。 – user786653

回答

2

使用应用程序验证程序调试此访问冲突。它应该在更好的调用堆栈比这个更好的调用堆栈发生时提前停止执行。

看起来像你在某处引用NULL指针,但程序没有立即崩溃,因为它是未定义行为,继续执行,稍后用奇怪的调用堆栈崩溃。

+0

这似乎是一个很好的计划,谢谢你的提示。但是,要么我不理解它,要么它不能帮助我。它会触发休息,但是调用堆栈在这里也没有帮助。唯一可检查的帧来自应用程序验证程序本身,可用的数据只是一条错误消息“当前堆栈跟踪的第一次机会访问冲突”。 – carlpett

+0

您必须加载关闭源框架的调试符号才能获得有用的调用堆栈。你有他们吗? – ks1322

+0

不是。我严重怀疑我将能够得到他们:( – carlpett

0

关于您的问题:是的,访问0x7A可疑看起来像在偏移量0x7a处取消引用NULL指针。 (也可以像引用0x20偏移0x5a一样)。

没有源代码访问,很难找出发生了什么。你可以试着回溯你的代码,并找出你所做的改变,从而使框架得到保护。然后,看看你是否在使用与应该使用的框架函数不同的框架函数。如果这一切似乎都没有结束,那么您也可以向您的框架供应商报告错误,但我建议您在这之前确保错误不在您身边。

+0

哦,我很确定这个故障是我的。添加新功能需要很多代码,并且全部都是一次添加的。我重新读了我的所有代码几次,并且无法发现任何错误,但我猜测我错过了初始化一些继承的函数指针成员(该框架有自己的类模拟,用C语言编写)。 – carlpett