Получение значения указателя стека при размотке стека с помощью dwarf2 - PullRequest
2 голосов
/ 18 февраля 2011

В формате отладки DWARF2 раскрутка стека поддерживается с помощью CFI (Call Frame Information), представленной в разделе .debug_frame. Это именно та таблица, в которой для каждого регистра хранится правило получения значения в предыдущем кадре. Однако все эти правила основаны на том факте, что регистры сохраняются в стеке в некотором месте. Это не верно для получения значения указателя стека в предыдущем регистре фрейма, когда нет фрейма-указателя. В таких случаях указатель стека может быть сохранен не в стеке, а просто управляться путем увеличения и уменьшения его значения. Однако в dwarf2 (или в целом в формате dwarf) нет способа указать, что значение регистра является выражением над его текущим значением. Итак, мой вопрос, как можно получить значение указателя стека во время разматывания стека с помощью формата отладки dwarf2 (когда указатель кадра отсутствует).

-BV

Ответы [ 3 ]

1 голос
/ 15 марта 2011

Похоже, что dwarf3 поддерживает DW_CFA_val_offset для такого случая. Таким образом, это может быть использовано для записи значения SP в предыдущем кадре на основе арифметического выражения над текущим значением. Другим возможным решением может быть сохранение указателя стека на самом стеке (будет работать с dwarf2). Это можно сделать на уровне оптимизации -O0, где эффективность кода не так важна.

0 голосов
/ 25 февраля 2011

Я пошел на это обсуждение.Но было просто интересно, пытался ли кто-нибудь когда-нибудь решить это другим способом.Один из способов, который я могу придумать, - это ненужное сохранение указателя стека в самом стеке.Затем используйте это местоположение, чтобы получить значение sp для предыдущего кадра.

0 голосов
/ 24 февраля 2011

См. в этой дискуссии о том, что кажется вашей проблемой.Я не уверен в том, что предложения уже вошли в нынешний стандарт.

...