Подключение отладчика из кода
От: RikkiTikkiTavi Россия  
Дата: 12.08.15 12:59
Оценка:
Здраствуйте!

Имеется своя длл, которая является аддином к большому стороннему приложению (native, managed).
Очень захотелось сделать аттач дебаггера студии одной строчкой в нужном месте в коде.
Т.е. при достижении желаемой точки выполнения появляется JIT окошко подключения отладчика.

1. DebugBreak().
Эта техника не срабатывает, приложение крашится со своим диалогом error report. Видимо, из-за того, что оно перехватывает это исключение и не отдает его винде. Как это обойти не знаю.

2. Потом нашел DebugActiveProcess().
Оно (есссно тоже не заработало. GetLastError выдает Access denied. Выставление привелегии SE_DEBUG_NAME почему-то не помогает, хотя везде написано именно про такой фикс.

Что делаю не так?

Заранее спасибо
Re: Подключение отладчика из кода
От: Хон Гиль Дон Россия  
Дата: 12.08.15 14:04
Оценка: 2 (1)
Здравствуйте, RikkiTikkiTavi, Вы писали:


RTT>Имеется своя длл, которая является аддином к большому стороннему приложению (native, managed).

RTT>Очень захотелось сделать аттач дебаггера студии одной строчкой в нужном месте в коде.
RTT>Т.е. при достижении желаемой точки выполнения появляется JIT окошко подключения отладчика.

RTT>1. DebugBreak().

RTT>Эта техника не срабатывает, приложение крашится со своим диалогом error report. Видимо, из-за того, что оно перехватывает это исключение и не отдает его винде. Как это обойти не знаю.

А пропатчить приложение чтоб оно не вызывало SetUnhandledExceptionFilter не пробовал? Или самому из Dll на старте (по process attach) дернуть SetUnhandledExceptionFilter(NULL).
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Подключение отладчика из кода
От: _Butch_  
Дата: 12.08.15 16:55
Оценка: 2 (1)
Здравствуйте, RikkiTikkiTavi, Вы писали:

RTT>2. Потом нашел DebugActiveProcess().

RTT>Оно (есссно тоже не заработало. GetLastError выдает Access denied. Выставление привелегии SE_DEBUG_NAME почему-то не помогает, хотя везде написано именно про такой фикс.

А потому что процесс не может отлажывать сам себя.
Re: Подключение отладчика из кода
От: flаt  
Дата: 12.08.15 18:05
Оценка:
Здравствуйте, RikkiTikkiTavi, Вы писали:

RTT>Имеется своя длл, которая является аддином к большому стороннему приложению (native, managed).

RTT>Очень захотелось сделать аттач дебаггера студии одной строчкой в нужном месте в коде.
Во многих отладчиках (в т.ч. и в студии) есть опция JIT Debugging, что по сути запуск отладчика с PID'ом процесса в командной строке.
Точно так же можно запустить отладчик вручную, передав ему свой PID — можно покопать в эту сторону.
Re: Подключение отладчика из кода
От: Serge Россия  
Дата: 12.08.15 19:57
Оценка: +1
Здравствуйте, RikkiTikkiTavi, Вы писали:

RTT>1. DebugBreak().

RTT>Эта техника не срабатывает, приложение крашится со своим диалогом error report. Видимо, из-за того, что оно перехватывает это исключение и не отдает его винде. Как это обойти не знаю.

Вместо "DebugBreak()" пишите "MessageBox(bla,bla...)", пока созерцаете месаджбокc — подключаете отладчик "Debug\Attach to process.."
Re: Подключение отладчика из кода
От: AlexeySmorkalov Россия https://ru.linkedin.com/pub/alexey-smorkalov/4/283/8b8
Дата: 12.08.15 21:06
Оценка:
RTT>1. DebugBreak().
RTT>Эта техника не срабатывает, приложение крашится со своим диалогом error report. Видимо, из-за того, что оно перехватывает это исключение и не отдает его винде. Как это обойти не знаю.

А почему не приаттачить сразу отладчик к процессу, после запуска? А когда процесс дойдет до этой точки, дернется дебаггер.
Re[2]: Подключение отладчика из кода
От: RikkiTikkiTavi Россия  
Дата: 13.08.15 12:04
Оценка:
S>Вместо "DebugBreak()" пишите "MessageBox(bla,bla...)", пока созерцаете месаджбокc — подключаете отладчик "Debug\Attach to process.."
Спасибо, Кэп!
Re[2]: Подключение отладчика из кода
От: RikkiTikkiTavi Россия  
Дата: 13.08.15 12:07
Оценка:
AS>А почему не приаттачить сразу отладчик к процессу, после запуска? А когда процесс дойдет до этой точки, дернется дебаггер.
Не шибко удобно, когда делаешь это по сотне раз на дню. Особенно, когда забываешь заатачиться...
Это рутина, и её хочется автоматизировать
Re[2]: Подключение отладчика из кода
От: RikkiTikkiTavi Россия  
Дата: 13.08.15 12:28
Оценка:
ХГД>А пропатчить приложение чтоб оно не вызывало SetUnhandledExceptionFilter не пробовал? Или самому из Dll на старте (по process attach) дернуть SetUnhandledExceptionFilter(NULL).

Спасибо за подсказку!

Вот так теперь работает:
    LONG WINAPI EmptyUEFilter(PEXCEPTION_POINTERS pExceptionInfo)
    {
        return EXCEPTION_CONTINUE_SEARCH;
    }

    void AttachDebugger()
    {
        if ( !IsDebuggerPresent() )
        {
            const LPTOP_LEVEL_EXCEPTION_FILTER prevFilter = SetUnhandledExceptionFilter( &EmptyUEFilter );
            DebugBreak();
            SetUnhandledExceptionFilter( prevFilter );
        }
    }
Re[3]: Подключение отладчика из кода
От: AlexeySmorkalov Россия https://ru.linkedin.com/pub/alexey-smorkalov/4/283/8b8
Дата: 13.08.15 19:54
Оценка:
RTT>Это рутина, и её хочется автоматизировать

Элементарно, сэр

            System.Diagnostics.Debugger.Launch();
            System.Diagnostics.Debugger.Break();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.