'dds esp' на Windbg

Я не уверен, понимаю ли я dds esp или его 64-битный аналог dqs rsp должным образом. Когда я вижу список записей в стеке, я склонен полагать, что везде, где я вижу адреса возврата, это вызовы, сделанные кодом, который еще не вернулся. Таким образом, объединяя их вместе, вы должны получить хороший стек вызовов. (давайте не будем беспокоиться с k* группа команд Windbg на данный момент.) Разве это не всегда так?

Поскольку есть некоторые сторонние расширения, которые работают с выходными данными esp/rsp и объединяют записи во что-то, что выглядит как стек вызовов, но я не могу сопоставить этот порядок с тем, что я вижу в источнике (хорошо, какой бы источник у меня не был.) Есть даже записи функций, которые вернулись давно.

Что мне не хватает?

ОБНОВИТЬ:

ОК - стороннее расширение, которое я использую, говорит:

Dumps (dps) from the stack limit the base only showing items that include the ! followed by +0x

Тогда возникает вопрос: что это за запись? Я думал, что это был адрес возврата какой-то функции, которая исправляет вызов в другую функцию?

1 ответ

Решение

dds означает вычитать слова (32 бита) и интерпретировать результат как символ. Аналогично для dqs (четырехзначное слово, 64 бита) и dps (размер указателя, соответствующий архитектуре).

Если вы прочитаете это снова, вы найдете термин символ как сокращение, а не стек. Любое число, которое окажется в памяти, будет интерпретироваться как символ, если это возможно. Это может быть вызов метода в стеке. И это также может быть локальная переменная, которая случайно имеет значение, соответствующее символу.

Эти локальные переменные, вероятно, не являются встречными переменными, такими как i а также j но возможно float или же double Тип данных, которые сложно предсказать, как они выглядят в памяти. Также, struct s может иметь компоновку, которая приводит к представлению в памяти, которое выглядит как символ.

Упомянутое вами расширение, кажется, делает простое dps и фильтровать строки, которые не имеют ассоциированного символа.

Еще, dps полезен в случаях повреждения стека, хотя вам нужно хорошо понимать, что делает ваше приложение, то есть какие символы могут быть в стеке вызовов, а какие нет.

Другие вопросы по тегам