2010-12-30 6 views
1

Вот страница проекта http://www.codeproject.com/KB/threads/StackWalker.aspxСомнение в StackWalker код

[STACKFRAME64][1] s; 

//s contains the current stack frame filled by calling [StackWalk64][2] WinAPI 

if (s.AddrPC.Offset == s.AddrReturn.Offset) 
{ 
    printf("StackWalk64-Endless-Callstack!"); 
} 

Мой вопрос, когда будет это условие будет удовлетворено? Какие адреса содержат s.AddrPC.Offset, s.AddrReturn.Offset? Является ли обратный адрес в последнем кадре на стек = 0?

+0

Упс! Я думаю, что вы заблуждались StackWalker в своем названии. – Corey

+0

@Corey: Спасибо за исправление! – Bruce

+0

О, ох, я забыл, что могу это сделать: P – Corey

ответ

1

Надеюсь, никогда, но это базовая проверка на работоспособность в случае, если рама стекается. Это маловероятно, если вы попытаетесь пройти стек в обработчике исключений, вызванном неприятным аппаратным исключением, например AccessViolation. Без этой проверки код войдет в бесконечный цикл, постоянно находя тот же стек кадров назад.

AddrPC - адрес инструкции вызова, AddrReturn - это адрес возврата, адрес предыдущей команды вызова (+5). Не уверен, что может означать «стек 0».

+0

@ Спасибо: Спасибо, что ответили. Я спрашивал, имеет ли нижний фрейм стека адрес возврата 0? – Bruce

+0

@ Hans: Скажем, у нас есть стек, подобный | A | B | с существом вершиной стека. AddrPC укажет на первую инструкцию A, а AddrReturn укажет на обратный адрес внутри B? – Bruce

+0

AddrPC - это адрес текущей команды в A. Где бы ни было, когда поток был приостановлен, редко первая инструкция. AddrReturn указывает на B, инструкция после вызова A. –