Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.11.03;
Скачать: [xml.tar.bz2];

Вниз

Падение приложения, crash без визуализации   Найти похожие ветки 

 
Es   (2013-05-15 12:22) [40]


> Ты поймаешь точный адрес исключения и сможешь вытащить всю
> цепочку вызовов, чтобы определить какой именно код вызвал
> падение.

а что значит точный адрес исключения? Почему адрес исключения винды не точный? Она ведь по идее должна отловить именно указатель на ту инструкцию, которая вызвала исключение?


> и сможешь вытащить всю цепочку вызовов, чтобы определить
> какой именно код вызвал падение.

а как я вытащу цепочку вызовов, если callstack"у хана на тот момент уже? (


 
Inovet ©   (2013-05-15 12:24) [41]

> [38] Es   (15.05.13 12:15)
> Но откуда эта надстройка:

Это псевдонимы, или как их там называют. В машинном коде их нет.


 
Rouse_ ©   (2013-05-15 12:25) [42]


> а что значит точный адрес исключения?

тот в котором действительно происходит AV


> а как я вытащу цепочку вызовов, если callstack"у хана на
> тот момент уже? (

Двойным проходом. В первый раз запоминаешь условия, при которых произошло падение.
Перезапускаешь приложение с установкой бряка по пойманному адресу и снимаешь стек вызовов до разрушения стека.


 
Es   (2013-05-15 12:26) [43]


> самый простой - по данному адресу были выставлены неверные
> аттрибуты страницы

а почему могут быть выставлены неверные атрибуты страницы на область памяти, где содержится код _очень_ системной DLL ?!


>  из-за срыва стека получить точный адрес ошибки не удалось
> и вылез вот этот вот оффсет.

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


 
Rouse_ ©   (2013-05-15 12:28) [44]


> а почему могут быть выставлены неверные атрибуты страницы
> на область памяти, где содержится код _очень_ системной
> DLL ?!

Обычно при перехвате меняются атрибуты страницы. Но причин на самом деле может быть море.


> как она тут может ошибиться?

Это даже не ошибка, это скорее следствие разрушения памяти приложения.


 
Es   (2013-05-15 12:30) [45]

правильно ли я понял вывод, что поскольку адрес у меня указывает на LdrInitializeThunk - то на 99% адрес исключения неверный в журнале записан?

Имеет смысл посмотреть в журнале адреса других падений?


 
Rouse_ ©   (2013-05-15 12:35) [46]

Ну опять-же если адрес верный, то тогда напрашивается вывод о неверном атрибуте защиты страницы, либо мусорном коде, записанном по данному адресу.

Лучше просмотреть все логи и проанализировать их данные, чтобы удостоверится в правильности адреса.


 
Es   (2013-05-15 14:27) [47]

Вытащил известные мне падения.

Faulting application OfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00041440, process id 0x2af8, application start time 0x01ce4589a1c25b76.

Faulting application OfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00041440, process id 0x2924, application start time 0x01ce4e0dda13f4ba.

Faulting application OfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00041440, process id 0x29fc, application start time 0x01ce4e33437990ba.

Faulting application ESOfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00065cd4, process id 0x2a98, application start time 0x01ce4eca05cbb5fe.

Faulting application ESOfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00041440, process id 0x2ae0, application start time 0x01ce4ed2616a69ba.

Везде 0x00041440, только в одном случае: 0x00065cd4

чтобы это значило всё...


 
Es   (2013-05-15 14:29) [48]

Прога одна и таже, версия тоже. Недоформатировал, вот так:

Faulting application OfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00041440, process id 0x2af8, application start time 0x01ce4589a1c25b76.

Faulting application OfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00041440, process id 0x2924, application start time 0x01ce4e0dda13f4ba.

Faulting application OfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00041440, process id 0x29fc, application start time 0x01ce4e33437990ba.

Faulting application OfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00065cd4, process id 0x2a98, application start time 0x01ce4eca05cbb5fe.

Faulting application OfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ntdll.dll, version 6.0.6002.18541, time stamp 0x4ec3e3d5, exception code 0xc0000005, fault offset 0x00041440, process id 0x2ae0, application start time 0x01ce4ed2616a69ba.


 
Rouse_ ©   (2013-05-15 14:34) [49]

Второй оффсет, это KiFastSystemCallRet

.text:77F35CD4                                           ; __stdcall KiFastSystemCallRet()
.text:77F35CD4                                                           public _KiFastSystemCallRet@0
.text:77F35CD4                                           _KiFastSystemCallRet@0 proc near
.text:77F35CD4 C3                                                        retn
.text:77F35CD4                                           _KiFastSystemCallRet@0 endp


то-же не информация ни о чем...

Так что эксперементируй с VEH


 
Es   (2013-05-15 14:54) [50]

Rouse_, а есть что-то вменяемое про готовку VEH с помощью delphi? Если еще и на рускком, так ваще...


 
Es   (2013-05-15 14:57) [51]

кстати, так как в большинстве случаев смещение 0x00041440 - не означает ли это что-то? Ну если бы там портилось все - это смещение должно было носить рандомный характер?


 
Es   (2013-05-15 15:01) [52]

Кстати, еще один момент есть. Именно эта программа запущена с другими настройками совершенно, но программа такая же. В таком варианте она падала один раз я вижу:

Faulting application OfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, faulting module ESOfflineServer.exe, version 1.0.1.103, time stamp 0x2a425e19, exception code 0xc0000005, fault offset 0x00030abb, process id 0x2ec4, application start time 0x01ce4e20a8871e66.

Может, тут что полезного...


 
Плохиш ©   (2013-05-15 15:15) [53]

Надо проверить куда пишут ваши потоки и как реализовано разруливание конфликтных ситуаций.


 
Es   (2013-05-15 15:48) [54]

Плохиш, как все просто оказывается)


 
Rouse_ ©   (2013-05-15 16:18) [55]


> Rouse_, а есть что-то вменяемое про готовку VEH с помощью
> delphi? Если еще и на рускком, так ваще...

На дельфи нет, но есть вот такой примерчик:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms681411


> faulting module ESOfflineServer.exe, version 1.0.1.103,
> time stamp 0x2a425e19, exception code 0xc0000005, fault
> offset 0x00030abb,

Вот это уже адрес внутри твоего модуля, тут только ты сам можешь сказать что у тебя.


 
Es   (2013-05-15 17:07) [56]

Блин, точно! :) Что-то я пропустил этот момент, подумал, что опять ntdll.dll
Взял map-файл от этой версии... Гы:

0001:000305A8       TEurekaModuleOptions.LoadFromStream
0001:00031328       TEurekaModuleOptions.StoreSharedData


Видимо, произошло исключение, еврика его перехватила, попыталась отправить отчет, начала считывать свои настройки.. и тут все умерло. Ну у меня такая версия.


 
Es   (2013-05-15 19:06) [57]

нашел в: http://www.f1-delphi.ru/books/sistemnoe_programmirovanie_v_s/vektornaya_obrabotka_isklyu4en/

"От функции VEH-обработчика требуется, чтобы она выполнялась быстро и никогда не получала доступа к объектам синхронизации, таким как мьютекс"

а почему это? У меня нет идей, как писать исключения в файл какой-нибудь что ли... Чтобы потом понять на каком этапе исключения "прервались" в логе - и последнее записанное исключение и есть искомое?
Но для записи нужно синхронизировать...

MSDN статья что-то не сильно помогла, там какие-то низкоуровневые операции, да и написано, что работает только для 32-ух бит, а у меня машина 64-битная (
И где взять заголовки все эти, описание рекордов в дельфи-синтаксисе, может есть у кого?
Я так понял, мне то нужно только дотянуться до адреса исключения в функции обратного вызова, вытащив его из структуры ExceptionInfo, да и все собственно...


 
Es   (2013-05-15 19:17) [58]

о, нашел вроде то, что нужно, вот эти два вопроса:

http://stackoverflow.com/questions/2628751/is-it-possible-to-have-a-global-exception-hook
и
http://stackoverflow.com/questions/14857106/how-to-get-the-exception-pointers-during-an-eexternal-exception

Если:

EXCEPTION_POINTERS = record
  ExceptionRecord : PExceptionRecord;
  ContextRecord : PContext;
end;


PExceptionRecord - подойдет описание из SysUtils?
Где бы взять еще PContext... И вроде так все уже проще выглядит...


 
Rouse_ ©   (2013-05-15 19:32) [59]


> да и написано, что работает только для 32-ух бит, а у меня
> машина 64-битная (

Но код-то у тебя 32 битный :)


> Где бы взять еще PContext... И вроде так все уже проще выглядит.
> ..


PExceptionRecord и PContext в Windows должны быть обьявлены.


 
Es   (2013-05-15 21:26) [60]

так так... Туман рассеивается)
А не прокомментируешь:

"От функции VEH-обработчика требуется, чтобы она выполнялась быстро и никогда не получала доступа к объектам синхронизации, таким как мьютекс"

?


 
Rouse_ ©   (2013-05-15 21:39) [61]

Исключения могут происходить в различных нитях - можем выйти на дедлок из-за особенностей механизма реализации VEH. Но правда это нужно очень сильно постараться, если честно...
Делай логирование через журнал событий http://rouse.drkb.ru/winapi.php#evntlog проблем быть не должно.


 
Es   (2013-05-16 10:56) [62]

реализовываю VEH тут, но вообще задумался. Интересно, если уж сама винда при крахе не может вытащить "нормальный" адрес исключения - как же может его указать некая технология винды при этом...


 
Cobalt ©   (2013-05-16 11:12) [63]

Если у тебя случился AV, это вовсе не значит, что он обязательно в этом месте.
Даже скорее всего, ошибка в другом месте, где не обнулилась ссылка.
Но найдя первый адрес, ты начнешь раскручивать цепочку событий:
- почему в нужном месте нет данных
- кто подсунул этот адрес
- что там должно было быть, по этому адресу
- где могло затереть данные/адрес


 
Es   (2013-05-16 11:35) [64]


> Даже скорее всего, ошибка в другом месте

очень даже возможно, что ошибка в другом месте, допустим, перетерта память. Но если бы там возникло исключение - то еврика все бы залогировала. А поскольку не залогировала - значит, исключения при данной неправильной операции не было, а значит и VEH не сработает. Вот и теперь не очень понимаю, чем мне VEH поможет...


 
Плохиш ©   (2013-05-16 11:40) [65]


> Cobalt ©   (16.05.13 11:12) [63]

Не мешай вумным искать ошибки у мелкого софта :-)


 
Плохиш ©   (2013-05-16 11:47) [66]

Кстати Rouse_ уже в [23] посте "опознавал", всё-равно скатился к дебагу системной библиотеки.


 
Rouse_ ©   (2013-05-16 15:02) [67]


> Интересно, если уж сама винда при крахе не может вытащить
> "нормальный" адрес исключения - как же может его указать
> некая технология винды при этом...

Она не использует VEH при детектировании падения приложения.


> Кстати Rouse_ уже в [23] посте "опознавал", всё-равно скатился
> к дебагу системной библиотеки.

Ну это я себя перепроверял, дома то на глаз примерно прикинул опираясь на вызов _RtlRaiseStatus


 
Es   (2013-05-16 15:30) [68]

блин у меня паранойя началась. Rouse_, а вот получу я управление в обработчике VectoredHandler, но ведь стек то уже поломан как ты полагаешь, я ж даже в лог записать не смогу, видимо...


 
Rouse_ ©   (2013-05-16 17:28) [69]


> а вот получу я управление в обработчике VectoredHandler,
>  но ведь стек то уже поломан

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


 
Es   (2013-05-16 18:27) [70]


> даже если он у тебя поломан, что тебе помешает выставить
> свои значения регистрам EBP+ESP

то, что я только что узнал, что можно что-то выставить. И один фиг не понял, что нужно выставлять)


 
Es   (2013-05-16 18:30) [71]


> поломка стека - это только одно из предположений.

а что же еще может быть? Ведь вроде как очевидно, что винда в журнале выдает неправильный адрес исключения - в каких еще случаях это может быть?

А если адрес правильный - то каким образом MOV EDI, EDI может привести к исключению? (


 
Плохиш ©   (2013-05-16 18:47) [72]


> Ведь вроде как очевидно, что винда в журнале выдает неправильный
> адрес исключения

Kак всегда винда виновата. Кто бы сомневался.

В журнале стоит адрес последней выполненной функции, в [23] даже название её опознано.
Винда не виноваты, что ты в своём коде не желаешь обрабатывать исключения, а т.к. нет обработки, винда со спокойной совестью убивает поделку.
Я советую ещё пару раз перечитать [53].


 
Es   (2013-05-16 18:59) [73]


> В журнале стоит адрес последней выполненной функции

а разве не адрес машинной инструкции, которая привела к исключению?


> в [23] даже название её опознано.

верно. Откуда можно сделать вывод, что опознано неверно. Ибо там находится инструкция mov EDI, EDI, которая не может вызвать исключения, кроме случая, как я понял, когда неправильно установлены атрибуты защиты страницы памяти.


> Винда не виноваты, что ты в своём коде не желаешь обрабатывать
> исключения

винда убивает процесс только когда не обработано исключение ГЛАВНОГО потока. Ты, я думаю, прекрасно понимаешь, что в стандартном GUI приложении дельфи все исключения обрабатываются.


> Я советую ещё пару раз перечитать [53].

абсолютно очевидно, что ты обиделся на [54], после чего не нашел ничего лучшего, как начать подкалывать. Не хочу отвечать тебя тем же и устраивать срач. Оно нужно?

Rouse_ видно - профи в таких делах отличный, вот я и пытаюсь как-то разобраться в проблеме, высказывая свои предположения нубские, может меня поправят нормально. А рекомендация из [53] аналогична словам "Там где-то ошибка в программе, посмотри внимательнее". Толку от этого - ноль, я и так понимаю. Программа большая, обслуживает информацию с тысячи физических точек, куда она только чего не пишет, чего только не делает и такие рекомендации - как об стену горох. А была бы она из 30-ти строчек - так и проблему бы почти наверняка не было бы.


 
Плохиш ©   (2013-05-16 19:23) [74]


> Ты, я думаю, прекрасно понимаешь, что в стандартном GUI
> приложении дельфи все исключения обрабатываются.

Да неужели. И кем?

> абсолютно очевидно, что ты обиделся на [54], после чего
> не нашел ничего лучшего, как начать подкалывать.

Капитан очевидность?

> аналогична словам "Там где-то ошибка в программе, посмотри
> внимательнее". Толку от этого - ноль, я и так понимаю.

Но предпочитаешь искать в другом месте.


 
Es   (2013-05-16 19:31) [75]


> Да неужели. И кем?

методом HandleException.


 
Rouse_ ©   (2013-05-16 19:43) [76]


> то, что я только что узнал, что можно что-то выставить.
> И один фиг не понял, что нужно выставлять)

Пока что это тебе не нужно, когда отловишь ошибку и выяснится что причина действительно в стеке, там и будем думать дальше.


 
Es   (2013-05-16 19:43) [77]

эх, надеюсь Rouse_ не положил на нуба с прибором))

Добил я VEH, но результаты странные. Сделал тестовое приложение, сделал там:


> > raise EDivByZero.Create("test");

мой обработчик VectoredHandler выдал следующее:

hInstance (приложения): 4194304
ExceptionCode: $0EEDFADE
ExceptionAddress: $76CEC41F


По ExceptionAddress с помощью
> GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS

определил базовый адрес модуля: ModuleAddress: 76CE0000

Через GetModuleName имеем: ModuleName: C:\Windows\syswow64\KERNELBASE.dll

Вложенных исключений нету.

Что-то я не понимать... По итогу, получается VEH фигню какую-то выдал...
Или я не до конца понимаю механизм...


 
Rouse_ ©   (2013-05-16 19:46) [78]


> Плохиш ©   (16.05.13 18:47) [72]
> Винда не виноваты, что ты в своём коде не желаешь обрабатывать
> исключения, а т.к. нет обработки, винда со спокойной совестью
> убивает поделку.

Это из серии, если у тебя колесо лопнуло, сам виноват что ехать не можешь.
Как он обрабатывать то будет если SEH фреймы уплыли?


 
Es   (2013-05-16 19:51) [79]

привожу все в HEX.

> raise EDivByZero.Create("test");

в логе от VEH получается:

hInstance: $00400000
ExceptionCode: $0EEDFADE
ExceptionAddress: $76CEC41F (ModuleAddress: 76CE0000, ModuleName: C:\Windows\syswow64\KERNELBASE.dll)
No nested except


 
Rouse_ ©   (2013-05-16 19:56) [80]

0EEDFADE - это код дельфийского исключения. т.е. штатный raise

cDelphiException    = $0EEDFADE;

Теперь тебе нужно расрутить цепочку SEH фреймов в обратном порядке. Первый фрейм находится в FS:[0].

Скачай Jedy Library там в папке Debug кажется был пример кода, который выполняет данные действия. (потребуется MAP файл чтобы получить нечно читабельное).
Когда выствоишь цепочку - все сам увидишь...



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2013.11.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.005 c
15-1368541324
Es
2013-05-14 18:22
2013.11.03
Падение приложения, crash без визуализации


2-1360138340
Lonsdale
2013-02-06 12:12
2013.11.03
multi edit records


15-1368891373
Разведка
2013-05-18 19:36
2013.11.03
Помогите устроится программистом


2-1360143133
Dmitry1987
2013-02-06 13:32
2013.11.03
проектирование иерархии классов


15-1368728640
Cynic
2013-05-16 22:24
2013.11.03
Разработчик интерфейсов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский