AccessViolation отладки весело - PullRequest
       21

AccessViolation отладки весело

0 голосов
/ 07 декабря 2011

У меня есть блок кода на C ++, который выглядит примерно так: psuedocode:

LPBYTE FindBits(const BITMAPINFOHEADER *pbi)
{
    return (LPBYTE)pbi + pbi->biSize + FindColorTableBytes(pbi);
}

Получает указатель на фактические данные DIB (растровые изображения).

Теперь у меня есть многопоточное приложение на c #, которое загружает растровые изображения из всех разных файлов (теооретически), никогда не повторяя одно и то же время. Он использует мою C ++ dll для обработки чтения и декодирования растровых изображений из документов.

Проблема в том, что я пытаюсь сделать эту библиотеку безопасной для нескольких потоков, но я получаю AccessViolationError в строке в функции выше. При попытке отладить эту проблему, при возникновении ошибки происходит сбой отладчика, и я смотрю на членов pbi. Они выглядят так:

{biSize=??? biWidth=??? biHeight=??? ...}

pbi - это битовая память, которая была заблокирована с помощью GlobalLock (handleToDib) и даже для того, чтобы получить указанную выше функцию для получения нарушения доступа, GlobalLock должен возвращать ненулевой указатель.

когда я смотрю на область памяти, возвращенную GlobalLock в окне памяти, это выглядит так:

?? ?? ?? ?? ?? ??

Если бы отладчик давал мне магическое число, я мог бы понять, если память была плохой ... но это сбивает меня с толку ... и, очевидно, отладчик. Кто-нибудь знает, почему отладчик показывает это?

1 Ответ

0 голосов
/ 07 декабря 2011

MSVS-отладчик достаточно хорош.
Используйте окно памяти, чтобы увидеть необработанную структуру объектов, и окна разборки, чтобы точно выполнять инструкции.

Конечно, OllyDbg может быть более удобен для таких задач (для людей, которыезнаю, как его использовать), но это не так просто, как отладчик MSVS.

...