class RSUIEXCEPTIONHANDLERAPI_API se_translator_registry {
public:
se_translator_registry()
{
m_active = 0;
}
~se_translator_registry()
{
}
bool register_translator()
{
return (InterlockedCompareExchange(&m_active, 1, 0) == 0);
}
void unregister_translator()
{
InterlockedExchange(&m_active, 0);
}
private:
volatile long m_active;
se_translator_registry(const se_translator_registry&);
se_translator_registry& operator=(const se_translator_registry&);
};
Как быстрее найти иголку в стоге сена
Есть ли более менее оптимальный способ определить, в каком именно месте сломалась программа на другом компьютере, не устанавливая Visual Studio на этом компьютере?
Во-вторых, программы, обычно, вылетают вследствие возникновения необрабатываемого исключения. Для определения участка кода, выполняемого в данный момент программой, в управляемом коде используют обычно Environment::StackTrace, в неуправляемом коде - отладочные макросы, составленные на основе встроенных лексемм __FILE__ и __LINE__, а для контроля правильности работы программы в критических местах - макросы типа TRACE и ASSERT.
Самый же радикальный и верочный вариант - сохранять дамп упавшего приложения для дальнейшего его анализа под отладчиком.
У нас предусмотрены макросы для обработки исключений. И в данном случае выскакивет диалог, который должен появляться при обработке исключения. Дамп тоже получется сохранить. Но вот получить из этого дампа необходимую информацию- не удаётся. Если приложение запускается не на том компьютере, на котором компилировалось, Call Stack всегда получается пустой. Может, мы что-то не так делаем?
Расскажите поподробнее, что за исключение, и при каких обстоятельствах оно возникает? Как сохраняете дамп (DrWatson, ADPlus, стандартные средства операционной системы)? Чем открываете дамп? Какую информацию несут отладочные диалоги? Может быть, имеет смысл включить отладочные проверки на выход за границы массива, переполнение и контроль целостности стека? Может быть, имеется возможность отлаживать решение удалённо (скажем, с помощью remote tool для MS Debugging Tools for Windows)?
Какова природа исключения? Это исключение .NET, C++ или исключение операционной системы (SEH и т. п.)?
Вопрос по поводу природы исполняемого кода (управляемый, неуправляемый?) также не раскрыт.
Наискорейший способ найти багу, в вашем случае - как можно точнее и лаконичнее описать проблему.
Что вы имеете в виду насчёт природы исполняемого кода? Мне не знакомы понятия управляемого \ неуправляемого кода. К тому же не понимаю, как определить природу исключения. Буду благодарна, если поделитесь информацией по этим вопросам.
уже рекомендовал для прочтения книгу.. В ней есть прекрасное описание создания дампов и пр. методов отладки приложений (как native так и dotNET)
Я
Цитата: Ap0k
Я уже рекомендовал для прочтения книгу.. В ней есть прекрасное описание создания дампов и пр. методов отладки приложений (как native так и dotNET)
Да я видела отзывы об этой книге. Наверное, действительно стоило бы почитать. Единственная проблема: где её можно достать?
Цитата: Nadezda
Да я видела отзывы об этой книге. Наверное, действительно стоило бы почитать. Единственная проблема: где её можно достать?
http://files.zipsites.ru/books/programming/robbins_dzhon__otladka_prilozhenii_dlya_microsoft_net_i_microsoft_windows.rar
Весит собака правда 40 Mb.
А так же
Код:
Почему на некоторых компьютерах в какой-то момент функция register_translator() может вернуть значение true ?
Цитата: Nadezda
может кто нибудь знает, зачем нужна функция InterlockedCompareExchange ?
Код:
LONG InterlockedCompareExchange(
LONG volatile* Destination,
LONG Exchange,
LONG Comperand
);
LONG volatile* Destination,
LONG Exchange,
LONG Comperand
);
Функция выполняет атомарное сравнение двух чисел: того, которое лежит в Destination и второго Comperand. Если они оказываются равны, то значение в Destination замещается Exchange значением.
Функция в любом случае возрвращет предыдущее значение Destination.
Цитата: Nadezda
Почему на некоторых компьютерах в какой-то момент функция register_translator() может вернуть значение true ?
Потому что m_active по какой-то причине содержит 0. После этого вызова m_active принимает значение 1 (судя по коду).
C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\Remote Debugger\<Платформа>\
устанавливаеца тупо копипастом...
а потом из VS на клиенте, просто атачимся (Debug->Attach to Process...) к процессу на удаленном сервере и всё... пробуем дебажить... =)))
P.S. софт дожен быть откомпилен в Debug режиме... так на всяк случай ;-)