Ошибка трассировки стека Windbg - PullRequest
1 голос
/ 24 февраля 2009

Я отлаживаю аварийный дамп управляемого кода, при использовании! Threads, чтобы показать все потоки здесь, пара потоков имеет значение поля Exception с различными исключениями.

Мой вопрос заключается в том, как определить, какое исключение является корневым исключением, которое быстро вызывает сбой процесса? Любые идеи, почему так много потоков связаны со значением исключения - я думаю, что должен быть только один поток (с необработанным исключением), который вызывает сбой процесса, почему так много потоков показывает исключение? : -)

спасибо заранее, George

Вот пример вывода части! Threads, FooException и GooException являются типом исключения моего приложения.

48 f 14c4 000000001d8bc4a0 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (0000000093365da0) 49 10 17e8 000000001acc26d0 200b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (0000000093364670) 50 11 135c 000000001acc3180 200b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (00000000dd707f70) 51 12 1740 000000001aca2ec0 200b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (00000000937e8a60) 52 13 814 000000001aca3970 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA GooException (000000009336c550) 53 14 6ac 000000001accb010 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (0000000093355f58) 54 15 1114 000000001accbac0 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA 56 16 d44 000000001accc570 200b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA GooException (00000000933c0598) 58 17 ff4 000000001accd020 200b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (00000000a8a39c48) 59 18 780 000000001accdad0 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA 60 19 8fc 000000001acce580 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (00000000abd5ff08) 61 1a 2e8 000000001accf030 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (00000000ac163ea0) 62 1b 11e8 000000001d8bd010 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (0000000093367c78) 63 1c 1520 000000001d8bd5e0 200b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA 64 1d 1330 000000001d8be090 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (00000000937d9540) 65 1e 7f8 000000001d8beb40 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (000000009339a038) 66 1f a70 000000001d8bf5f0 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (00000000937d8b88) 67 20 150 000000001d8c00a0 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA 68 21 1628 000000001d8c0b50 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (0000000093355200) 69 22 1148 000000001d8c1600 200b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA GooException (000000009380ada8) 70 23 16a8 000000001d8c20b0 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (0000000093365178) 71 24 1640 000000001d8c2b60 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (0000000093343a78) 72 25 1568 000000001d8c3610 b020 включено 0000000000000000: 0000000000000000 0000000000162080 0 MTA FooException (000000009380cc08)

Ответы [ 2 ]

4 голосов
/ 26 февраля 2009

Когда вы отлаживаете дамп, вы можете найти неисправный поток с помощью команды "~" , а затем искать "." рядом с одним из потоков. Затем вы переходите на этот поток и запускаете kb . Вы должны увидеть вызов RaiseException () в собственном стеке вызовов.

Также вы можете запустить ! Clstack , чтобы получить управляемый стек вызовов, если вы знаете интересующий поток.

Вы также можете запустить ! Pe в потоке, чтобы вывести вывод (! PrintException).

Это должно помочь вам в большей части… не стесняйтесь комментировать и делиться большим количеством данных, основываясь на описанных мною шагах, и мы сможем решить эту проблему быстро

Чтобы ответить на ваш вопрос, кажется, что в течение некоторого времени, когда исключение находится в потоке, вывод! Threads будет указывать это. Таким образом, похоже, у вас есть много исключений, чтобы выследить.

Еще одна техника (которая заслуживает еще одного TAG: -)

Чтобы отследить другие исключения, вы можете использовать Visual Studion и разрешить взлом исключаемого исключения в пользовательском интерфейсе. Если вы дерзаете, вы можете запустить Mdbg и выполнить следующие команды, чтобы поймать выбрасываемые исключения

Open a VS.NET 2005/2008 Command Prompt
mdbg
>pro //Lists the processes
>a <PID> //attach to the processes
>ca ex //catches all exceptions
>g //go until break
//When it breaks on an exception
>where -v -c 200 // dumps the managed call stack (verbose) with a count of 200 frames
>print //prints out locals on the stack
>g //go to next exception
>de //Detach when done.. process stays running
>q //Quit the debugger

Приятной особенностью MDbg является то, что вы можете выполнять отладку на уровне исходного кода. (возможно, я создам для них тег MDbg )

Спасибо, Аарон

1 голос
/ 04 января 2010

George2, Вы пробовали команду "! Analysis -v"? Вы загрузили расширение отладчика sos dot net? (попробуйте команду .chain, чтобы увидеть, есть ли она там). Анализ -v очень полезен. , .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...