WinDbg'ing Единични тестове C#

Какъв е моят въпрос/проблем? Опитвам се да използвам WinDBG, за да прикача към няколко от моите модулни тестове, които са в библиотека от класове (Проект за тест на модул), но не мога да накарам WinDbg да прекъсване при управлявани изключения.

Защо правя това? В момента имам тестове, които използват подложки и се натъквам на този проблем: UnitTestIsolationException: Извежда изключение при изпълнение на Shims тест в режим Release/Debug

Това обаче се случва САМО когато тези тестове се изпълняват в тандем (един и същ списък за изпълнение в изследователя на тестове) с някои други тестове, които не използват подложки. Когато се изпълняват индивидуално, тестовете преминават добре.

Така че реших, че ще стартирам WinDbg (с моите много ограничени познания за него), ще се прикрепя към тестовия инструмент и ще прекъсна изключенията там.

Какво опитах: Тъй като това е DLL, очевидно се зарежда от някакъв изпълним файл, за да изпълни кода в рамките на тестовете (тестова програма). Макар че първоначално бях просто изпълнявах тези тестове във Visual Studio, имах проблем да определя кой процес да прикача и WinDbg, така че вместо това започнах да използвам vstest.console.exe, за да започна да изпълнявам тестовете, след което прикачих към него .

Мога да прикача добре и WinDbg спира изпълнението на тестовия инструмент (да!).

Сега искам да прекъсна веднага щом бъде хвърлено изключение от CLR (което означава моето изключение UnitTestIsolationException). След гугъл открих командата windbg за това: sxe clr

След това пиша g и програмата започва отново да изпълнява моите тестове.

Поведение, което виждам: WinDbg никога не прекъсва на UnitTestIsolationException - всички тестове се изпълняват до завършване, резултатите от теста се отпечатват на конзолата, след което програмата прекратява:

Passed   [SomePassingTestName]
Passed   [SomePassingTestName]
Failed   [TheFailedTestMethodName]
Error Message:
   Test method [TheFaileTestMethodName] threw exception:
   Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationExceptio
n: Unexpected error returned by SetDetourProvider in profiler library 'C:\Progra
m Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsof
t\IntelliTrace\14.0.0\Microsoft.IntelliTrace.Profiler.14.0.0.dll'.

person Paul Zaczkowski    schedule 07.01.2016    source източник
comment
Бихте ли предоставили SSCCE (минимален пример)?   -  person Thomas Weller    schedule 07.01.2016
comment
какво управлявано разширение за отстраняване на грешки използвате? sos / psscor / sosex?   -  person MaLio    schedule 07.01.2016
comment
@MaLio Използвам sos   -  person Paul Zaczkowski    schedule 07.01.2016
comment
@Thomas Ще видя какво мога да осигуря, това идва от средно голяма кодова база, използваща DI и други подобни, така че трябва да се опитам да разбия съответните части.   -  person Paul Zaczkowski    schedule 07.01.2016
comment
Сигурни ли сте, че vstest.console.exe не стартира нов процес за изпълнение на действителния тест? Можете да използвате procmon, за да проверите това. Също така бих опитал procdump от sysinternals за изхвърляне при първи шанс изключения. procdump -e 1 <pid or unique name>   -  person Lieven Keersmaekers    schedule 08.01.2016
comment
Предпочитам psscor, но опитайте !StopOnException -derived -create System.Exception   -  person MaLio    schedule 08.01.2016
comment
@LievenKeersmaekers Отлична идея! Разрових се в procmon и установих, че vstest.console.exe всъщност стартира два подпроцеса: te.processhost.exe и te.processhost.managed.exe. Прикачването към te.processhost.managed.exe изглежда работи :D   -  person Paul Zaczkowski    schedule 09.01.2016
comment
@MaLio с идеята на Lieven и вашия код успях да го накарам да се счупи при изключенията. За съжаление на този етап нямам необходимите PDB файлове, за да търся много повече, така че ще видя дали мога да ги намеря някъде, ако не, ще трябва да се свържа с Microsoft.   -  person Paul Zaczkowski    schedule 09.01.2016
comment
Накратко, и двамата наистина ми помогнахте да отговоря на въпроса тук (защо не нарушавам моите изключения), така че, моля, добавете отговори и аз ще ги маркирам по подходящ начин. Благодаря!   -  person Paul Zaczkowski    schedule 09.01.2016
comment
@MaLio - Не считам, че приносът ми е от същия клас като вашия, така че ако бихте направили честта да предоставите отговор, ще имате моето гласуване.   -  person Lieven Keersmaekers    schedule 09.01.2016
comment
@LievenKeersmaekers благодаря ... най-любезно от ваша страна   -  person MaLio    schedule 11.01.2016


Отговори (1)


Можете да избегнете програмирането с три звезди, като върнете масив от указатели и подадете броя по указател. Бъдещите поддържащи наистина ще ви харесат. И... подсказка: избягвайте strtok() това е зло и е гадно.
person MaLio    schedule 11.01.2016
comment
Благодаря! Както беше посочено в коментарите по въпроса, в допълнение към това процесът, който отстранявах грешки, стартираше дъщерни процеси и към тях /тези/ трябваше да се прикачат. - person Paul Zaczkowski; 11.01.2016
comment
@PaulZaczkowski: Така че, ако .childdbg 1, имате ли още нужда от !soe или sxe clr е достатъчно? - person Thomas Weller; 12.01.2016