'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
полезен в случаях повреждения стека, хотя вам нужно хорошо понимать, что делает ваше приложение, то есть какие символы могут быть в стеке вызовов, а какие нет.