Я использую большой фреймворк с закрытым исходным кодом. Я недавно добавил новую сущность, и теперь у меня возникают нарушения доступа при выполнении некоторых действий. Однако они возникают при вызовах из фреймворка, поэтому я не знаю, что я реализовал неправильно, поскольку у меня нет стека вызовов.

Нарушение сообщается в функции _CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue(), определенной в файле CRT tidtable.c. Конкретная строка - 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()     
4
carlpett 29 Авг 2011 в 13:19

2 ответа

Лучший ответ

Используйте Application Verifier для отладки этого нарушения прав доступа. Он должен останавливать выполнение раньше, когда происходит что-то плохое с лучшим стеком вызовов, чем этот.

Похоже, вы где-то разыменовали NULL-указатель, но программа не вылетела сразу, поскольку это Undefined Behavior, продолжила выполнение и немного позже разбилась из-за странного стека вызовов.

2
ks1322 29 Авг 2011 в 10:53

Что касается вашего вопроса: Да, доступ к 0x7A подозрительно выглядит как разыменование указателя NULL по смещению 0x7a. (Хотя также может быть что-то вроде разыменования 0x20 со смещением 0x5a).

Без доступа к исходному коду трудно понять, что происходит. Вы можете попробовать вернуться к своему коду и выяснить, какое изменение вы внесли, заставив фреймворк выйти из строя. Затем посмотрите, используете ли вы функцию фреймворка, отличную от того, как она должна использоваться. Если все это кажется бесконечным, вы также можете сообщить об ошибке поставщику фреймворка, но я бы посоветовал вам убедиться, что ошибка не на вашей стороне, прежде чем вы это сделаете.

0
BjoernD 29 Авг 2011 в 09:34