Как отладить исключение System.StackOverflowException без ссылки на исходный код?

В последнее время я регулярно сталкиваюсь с ошибками типа

  

"Необработанное исключение типа 'System.StackOverflowException'   произошло в неизвестном модуле. ".

Это происходит в игре (которую я разработал) с довольно большой базой кода (C # /XNA). Но обычно ошибка возникает только после нескольких минут игрового процесса (и не при каждом запуске).

Проблема в том, что, к сожалению, отладчик Visual Studio, по-видимому, не может локализовать проблему дальше и просто позволяет мне просматривать код ассемблера без ссылки на мои исходные строки. Как можно отладить такую ​​ошибку? Я думаю, такие инструменты, как Valgrind не доступны в C #. Может быть, есть лучший отладчик, который может показать мне, где проблема локализована в исходном коде?

Стек вызовов доступен при применении шагов из предложенного ответа ниже. Это:

[email protected]()  + 0x15 bytes 
[email protected]()  + 0x15 bytes 
[email protected]()  + 0xcb bytes    
[email protected]()  + 0x43 bytes    
clr.dll!CLREvent::CreateManualEvent()  - 0x15f3bb bytes 
clr.dll!CLREvent::CreateManualEvent()  - 0x15f37a bytes 
clr.dll!CLREvent::WaitEx()  + 0x47 bytes    
clr.dll!CLREvent::Wait()  + 0x19 bytes  
clr.dll!Thread::WaitSuspendEventsHelper()  + 0xa8 bytes 
clr.dll!Thread::WaitSuspendEvents()  + 0x17 bytes   
clr.dll!Thread::RareEnablePreemptiveGC()  + 0x181977 bytes  
clr.dll!Thread::RareDisablePreemptiveGC()  + 0x38e3 bytes   
clr.dll!Debugger::SendException()  + 0x12b bytes    
clr.dll!Debugger::LastChanceManagedException()  + 0x19f bytes   
clr.dll!NotifyDebuggerLastChance()  + 0x79 bytes    
clr.dll!WatsonLastChance()  + 0x166 bytes   
clr.dll!EEPolicy::HandleFatalStackOverflow()  + 0x189 bytes 
clr.dll!EEPolicy::HandleStackOverflow()  + 0xd8 bytes   
clr.dll!_COMPlusFrameHandler()  + 0xff302 bytes 
[email protected]()  + 0x26 bytes    
[email protected]()  + 0x24 bytes 
[email protected]()  + 0xd3 bytes   
[email protected]()  + 0xf bytes   
clr.dll!SystemNative::ArrayCopy()  + 0x19 bytes 
mscorlib.ni.dll!6ed326a2()  
Frames below may be incorrect and/or missing, no symbols loaded for mscorlib.ni.dll 
7 голосов | спросил ares_games 7 Jpm1000000pmMon, 07 Jan 2013 17:29:21 +040013 2013, 17:29:21

2 ответа


0

Если сбой происходит с ntdll.dll, вам понадобятся символы для него, но я думаю, что более вероятна вероятность того, что вы передаете какой-то странный мусор, который вызывает его сбой. Вы делаете вызовы API Windows, которые могут привести к сбою?

Еще одна возможность, о которой упомянул другой пользователь, это то, что вы могли бы делать рекурсивный вызов где-то, где заканчивается стек. Это было бы особенно проблематично, если бы выполнялись вызовы неуправляемых фрагментов кода:

  • Есть ли логические условия, которые могут вызвать бесконечный цикл?
  • Есть ли конструкторы, которые делают непреднамеренные рекурсивные вызовы?
  • Есть ли в вашем коде какие-либо рекурсивные методы, которые могут застрять?

Кроме того, пара вещей, которые вы можете попробовать, прежде чем отправиться в путь, чтобы найти альтернативный способ отладки:

  1. Убедитесь, что проект встроен в отладку
  2. Проверьте настройки Visual Studio, чтобы убедиться, что он останавливается во всех исключениях
  3. Отключите настройку "просто мой код", если она доступна в настройках вашего проекта (она вообще отображается в проектах C #?)
  4. Включить отладку /неуправляемую отладку в смешанном режиме
  5. Убедитесь, что символы генерируются и хранятся в правильном месте (* .pdb)
  6. Если все это не удастся, вы можете поковыряться в просмотре системных событий и искать любые странные ошибки
ответил Ray 8 Jam1000000amTue, 08 Jan 2013 03:51:05 +040013 2013, 03:51:05
0

StackOverflowException обычно вызывается каким-либо методом, который бесконечно вызывается.

Тот факт, что это происходит через некоторое время, делает меня еще более непреклонным: вы сталкиваетесь с бесконечной рекурсией.

Чрезвычайно простым примером такого поведения будет:

void SomeMethod()
{
    SomeMethod(); // StackOverflowException
}
ответил Alex 8 Jpm1000000pmTue, 08 Jan 2013 18:42:45 +040013 2013, 18:42:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132