Как получить собственную трассировку стека из собственных исключений, обнаруженных в управляемом коде - PullRequest
5 голосов
/ 17 мая 2010

У меня есть некоторый управляемый код, который вызывает метод внутри некоторой нативной DLL (у меня есть соответствующие файлы символов).
Иногда этот нативный метод генерирует исключение, которое я улавливаю в своем управляемом коде. Однако, когда я печатаю трассировку стека из моего пойманного исключения, я вижу только управляемый код (последний кадр - это вызов нативного кода ... но он не видит стековую дорожку внутри нативного кода).

Как мне также получить нативный стэк?
* Когда я отлаживаю код, я могу зайти в нативный код и увидеть стек вызовов actall.

Ответы [ 2 ]

2 голосов
/ 17 мая 2010

Получить собственную трассировку стека довольно сложно. К тому времени, когда он проходит через уровень трансляции .NET / native, трассировка собственного стека уже потеряна.

Итак, вам нужно захватить его, пока он еще находится в нативном коде, и это тоже довольно сложно. Взгляните на работу Джона Роббинса по правильной трассировке нативного стека; последняя общедоступная версия его SUPERASSERT, которую я смог найти, - MSJ, февраль 1999 .

1 голос
/ 10 августа 2010

Это не так гладко, как отображение собственного стека вызовов при обнаружении исключения, но если вы пытаетесь отследить конкретную проблему на компьютере пользователя, и пользователь достаточно опытен, вы можете заставить его запустить ваше приложение WinDbg. Он прервется, когда будет сгенерировано собственное исключение, и можно будет просмотреть стек вызовов.

Другая возможность - использовать стек-ходок. Это бесплатно и доступно здесь: http://www.codeproject.com/KB/threads/StackWalker.aspx Если вы знаете собственный вызов верхнего уровня, вы можете заключить его в ловушку __try / __ и использовать stackwalker для выгрузки стека в файл журнала. Предположительно, вы также можете перехватить исключение, получить стек вызовов с помощью stackwalker, добавить стек вызовов в исключение (в виде строки), а затем повторно выбросить исключение в свой код .NET. Затем код .NET может вывести стек вызовов из вашего исключения.

...