Как я могу определить, подключен ли отладчик * и * установлена ​​или остановлена ​​ли точка останова? - PullRequest
1 голос
/ 24 марта 2011

Я знаю, что могу использовать Debugger.IsAttached , чтобы определить, подключен ли отладчик, но я хочу иметь возможность сделать что-то вроде

if (Debugger.IsAttached && Debugger.BreakpointIsSet && Debugger.BreakpointHitCount > 0)
    timeout *= 100;
someEvent.WaitOne(timeout);

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

Возможно ли что-то эквивалентное вышеизложенному; например, используя P / Invoke для неуправляемого API отладки?

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

Я не знаю о такой возможности, но что именно является точкой останова, которая была достигнута? Это приостановленное выполнение как минимум потока, в который попадает ваша точка останова. Исходя из этого, вы можете использовать Thread.ThreadState и проверить состояние Suspended. Чтобы это работало, вам понадобится ссылка на интересующую вас ветку.
Отказ от ответственности: я не знаю, будет ли это работать или имеет ли это какие-либо побочные эффекты, поэтому, даже если это работает, используйте его только для отладки и убедитесь, что его нет в рабочем коде.

2 голосов
/ 25 марта 2011

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

Я бы сказал, что вам лучше держаться подальше от отладчика на этом и хорошо выполнять "отладку printf" и, конечно, смотреть на ThreadID, из которого было сгенерировано каждое сообщение.

Тем не менее, если вы все еще хотите использовать для этого отладчик, может быть полезным для просмотра только одного потока (и только одного потока), пока все другие заблокированы, и отслеживания его активности. когда система входит в поврежденное состояние - эта ссылка может быть полезна для этого: http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/07/17/automatically-freezing-threads-brrrrr.aspx

2 голосов
/ 24 марта 2011

Точки останова являются функцией IDE (Visual Studio) и отладчика, а не самой платформы .NET ... Насколько я знаю, ближе всего к тому, что вам нужно, это использовать Visual Studio * 1001. * «Условие точки останова» функция ...

...