Отладка структуры _CONTEXT в Windows: Как? - PullRequest
0 голосов
/ 22 января 2011

[ДОБАВЛЕНИЕ: ВОПРОС НЕ НУЖЕН БЫТЬ ОТВЕТСТВЕННЫЙ В ОТНОШЕНИИ НЕПРАВИЛЬНОГО ПОЛОЖЕНИЯ НА МОЕЙ ЧАСТИ;ПОСМОТРИТЕ МОЙ ОТВЕТ И НИЖЕ ИЗВЛЕЧЕНИЯ]

Мой клиент передал мне файл трассировки, отправленный клиентом, который включает (релевантно) только информацию о регистре ЦП, содержащуюся в структуре _CONTEXT во время возникновения исключения.

Я несколько месяцев совершенствовал, компилировал и собирал код (написанный на C ++ с некоторыми вызовами JNI для JVM) для программы, и новая версия, которую я создал, была выпущена для клиентов:файл трассировки с сообщением об ошибке.Этот файл трассировки был создан программой и просто соответствует выбрасыванию данных регистра (содержащихся в структуре _CONTEXT), которые были получены путем установки пользовательского обработчика исключений для программы (через SetUnhandledExceptionFilter ()).

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

Поэтому я работаю в предположении, что он был вНа самом деле выходные данные регистра ЦП из структуры _CONTEXT, которые предыдущие разработчики сочли полезными в файлах трассировки, и я пытаюсь найти способ интерпретации этой информации, чтобы помочь отследить, что происходило во время сбоя.(то есть, какую функцию вызывали и каковы ее аргументы и т. д.)

Возможно, невозможно использовать данные регистра ЦП без какой-либо другой информации, и в этом случае мой клиент может ввести меня в заблуждениеДело в том, что предыдущие разработчики имели в своем распоряжении файлы трассировки, которые содержали информацию в дополнение к информации о регистре ЦП.

Итак, я хотел бы знать одну вещь : выполнимо ли это вообще, используя ONLY информацию о регистре ЦП, имеющуюся в структуре данных _CONTEXT, наряду со всем доступным исходным кодом в успешной среде сборки Debug & Release для получения полезной информации?

Предполагая, что ответ «да», я хотел бы знать следующее: : как можно получить полезную информацию из информации о регистре ЦП, содержащейся в структуре _CONTEXT, при условии, что исходный код доступен, и чтоэтот исходный код успешно работает на Dмашина разработки как в режиме отладки, так и в режиме выпуска (но не в среде конечного пользователя и без каких-либо файлов или данных конечного пользователя, кроме одного отмеченного файла трассировки)?Я полагаю, что цель состоит в том, чтобы найти функцию, которая была вызвана во время исключения, на основе ее адреса, и, надеюсь, эта функция будет той, которая находится в существующей базе кода (и не вложена глубоко в библиотеки DLL Windows),Кроме того, мой клиент указал, что предыдущие разработчики даже могли получить аргументы для функции виновника, которая вызвала исключение (хотя, опять же, он мог вводить меня в заблуждение).

Обратите внимание, что, конечно, конечный пользователь используетРелиз-режим сборки программы.Я также предположил бы, что информация _CONTEXT, выводимая в файл трассировки, будет соответствовать процессору, используемому конечным пользователем.

Короче говоря, я спрашиваю, как интерпретировать различные поля структуры _CONTEXT, которые представляют регистры ЦП в Windows, полезным способом для отладки исключения. Что соответствуют регистрам и на какие мне смотреть? Вот ссылка на страницу, которая включает определение структуры _CONTEXT для некоторых (не всех) процессоров, в качестве примера возможных структур _CONTEXT: http://msdn.microsoft.com/en-us/library/ms679284%28VS.85%29.aspx. Я не уверен, какой процессор использует конечный пользователь, но эта информация будет легко доступна по мере необходимости, если я уверен, что смогу получить некоторую полезную информацию из структуры _CONTEXT. Обратите внимание, что файл трассировки, который я имею, показывает 128 (4-байтовых) записей - что, кажется, не соответствует размеру любых структур _CONTEXT, которые я видел (я также посмотрел в WINNT.H, Фактический файл, который определяет структуру _CONTEXT, и на первый взгляд не видел никаких возможных определений, которые содержали бы 128x4 байта, но это был только быстрый взгляд, и я могу ошибаться).

Я охотился за ответами или подсказками, но пока не нашел полезных.

Спасибо,

Dan.

1 Ответ

1 голос
/ 22 января 2011

МОЙ ВОПРОС НЕ ПРАВИЛЬНО ИДЕНТИФИЦИРОВАЛ ИНФОРМАЦИЮ, ПРЕДСТАВЛЕННУЮ В ОБРАЗЕЦЕ, И НЕ НУЖНА ОТВЕТИТЬ.

Мои извинения всем.

После просмотра кода, который создает данные в файле трассировки, указанном в вопросе, я обнаружил, что допустил ошибку. Это не структура _CONTEXT , значения которой выводятся в файл трассировки, а скорее код переходит через _CONTEXT :: Esp и выплевывает это (т. Е. Это обход стека). сам во время выполнения в ответ на исключение - он не выплевывает содержимое регистров ЦП).

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

Спасибо, Dan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...