Начну с того, что я не на 100% понимаю все, что мне нужно было сделать, но вот шаг, который я предпринял, чтобы выяснить, где проблема с переполнением стека была в моем приложении ...
Большинство информации пришло из этого блога .
На сервере я добавил следующие параметры реестра для создания файлов дампа cra sh ...
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\w3wp.exe]
"DumpCount"=dword:00000005
"DumpFolder"=hex(2):43,00,3a,00,5c,00,43,00,72,00,61,00,73,00,68,00,44,00,75,\
00,6d,00,70,00,73,00,5c,00,00,00
(DumpCount
- это количество файлов, которые нужно сохранить перед тем, как он начнет перезаписывать старые - DumpFolder
- это место, где файлы должны быть сохранены, это REG_EXPAND_SZ
и в мой случай представляет C:\CrashDumps\
)
- Ожидал сбоев
- Скопировал файлы cra sh в каталог на моем локальном компьютере с именем
C:\WinDbg\CrashDumps\
- Создайте еще один каталог с именем
C:\WinDbg\Symbols
, в который я поместил ... clr.dll
(с сервера, взято из C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
) sos.dll
(с сервера, взяты из C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
) - всех
.dll
и .pdb
файлов из моей локальной среды разработки, включая th компонент стороннего производителя .dll
файлы
- Установлен
WinDbg
через Windows Сохранить на моей Windows 10 машине разработки - Выполнить
windbgx -y c:\windbg\symbols
через команду Выполнить ( по какой-то причине на моей машине это windbgx
, но, возможно, это потому, что это через Магазин, а не ручная загрузка) - В меню файлов
Open dump file
и выберите один из файлов дампа в C:\WinDbg\CrashDumps
- Выполнение следующих команд ...
.symfix
.reload
.load c:\windbg\symbols\sos.dll
(см. Примечание 1 ниже) !clrstack
(см. Примечание 2 ниже)
Хотя это не дало мне всей информации, которую я ожидал, он показал, что один из моих сторонних компонентов был 100 % виноват в исключении stackoverflow.
Примечание 1. Во многих местах, которые я читал, говорилось, что .loadby sos clr
следует использовать, но это дало мне The call to LoadLibrary(C:\ProgramData\Dbg\sym\clr.dll\5E7D1F3B9eb000\sos.dll) failed
, и я не мог понять, как это исправить ... поэтому вместо этого я использовал .load c:\windbg\symbols\sos.dll
.
Примечание 2 - Команда !clrstack
работала, потому что WinDbg, казалось, предварительно выбирал поток, который было исключение. Другой вариант - использовать ~*e !clrstack
, который покажет вам стеки вызовов для ВСЕХ потоков.