2012-03-08 20 views
12

Załóżmy, że mam funkcję, która zgłasza wyjątek. Załóżmy, że ta funkcja jest wywoływana przez zewnętrzną bibliotekę DLL, a trzecia strona DLL obsługuje wyjątek, który został zgłoszony.Co Visual Studio uważa za "Kod użytkownika"?

Jeśli program Visual Studio zdecyduje, że zewnętrzna biblioteka DLL nie jest "kodem użytkownika" (jak widać na poniższym obrazku), domyślnie zatrzyma się na moim wyjątku, mimo że zostanie później przetworzona. Niepoprawnie nie jest to ; wyraźnie wyjaśnia, że ​​wyjątek był nieobsługiwany przez kod użytkownika. Ale co sprawia, że ​​Visual Studio nazywa niektóre biblioteki DLL "kodem użytkownika", a inne nie?

enter image description here

miałem teorię, że dzieje się tak dlatego, że symbole nie są ładowane, ale istnieją moduły w liście, który został załadowany symbole, ale wciąż nie są uważane za „Kod użytkownika”.

+0

Dla innych okno Moduły znajduje się w menu Debugowanie, wybierz Windows, a następnie kliknij Moduły. Przydatny ekran do śledzenia tego, co właśnie .dll jest używane (mój kod nie debugowałby, ponieważ korzystał z kopii biblioteki w GAC zamiast danych wyjściowych z projektu referencyjnego), dzięki za wskazanie go. – RyanfaeScotland

Odpowiedz

12

Tak, bez pliku .pdb debugger nie może stwierdzić, czy jest to kod użytkownika, czy nie. Jest dość dobrze wyjaśnione w MSDN article:

Aby odróżnić kod użytkownika z kodu non-user, Just My Kod wygląda na trzech rzeczach: DBG, pliki PDB i optymalizacji.

W standardowej wersji debugowania optymalizacja jest wyłączona, a symbole debugowania są tworzone dla wszystkich modułów. Po uruchomieniu kompilacji debugowania moduły te są uznawane za kod użytkownika. Jeśli zadzwonię do funkcji biblioteki, która jest zoptymalizowana i nie ma symboli debugowania, nie jest to jednak kod użytkownika. Tylko mój kod zapobiega zatrzymywaniu wykonywania w punktach przerwania w kodzie biblioteki, który zwykle nie jest kodem, który jest zainteresowany debugowaniem. W oknie Punktów przerwania te punkty przerwania będą wyświetlane z ikoną Wyłączony punkt przerwania.

+0

To jest idealne. Mając to na uwadze, napisałem odpowiedź na [zapobieganie zatrzymywaniu się debuggera we wszystkich wyjątkach w bibliotece] (http://stackoverflow.com/a/9616890/33080) i dodano [inne obejście dla NUnit 'Assert.Throws 'zatrzymanie się] (http://stackoverflow.com/a/9609494/33080). Miły! –

+0

To nadal jest niejasne. Sądzę, że można bezpiecznie powiedzieć "Kod użytkownika = brak optymalizacji + symbole debugowania"? –

Powiązane problemy