Указатель стека / фрейма как внешняя переменная - PullRequest
0 голосов
/ 15 сентября 2018

В настоящее время я писал логику логирования и хотел сделать отступ. Самый простой способ понять, присутствовал ли какой-либо вызов функции или какая-то функция завершилась, - посмотреть на текущий адрес стека / кадра. Давайте предположим, что стек растет вверх ногами, тогда, если адрес стека в вызове log() меньше, чем во время предыдущего вызова, мы можем увеличить отступ, так как присутствовал некоторый вызов функции. Я знаю, что есть такие функции, как backtrace(), которые знают, как ее вывести, или вы можете использовать некоторую сборку, однако я помню чтение внешних переменных, которые можно использовать для получения этой информации. Может ли кто-то назвать эти переменные или дать ссылку, где я могу их найти (насколько я помню, это было в некоторых книгах по компьютерным системам, таких как «Компьютерные системы: Перспектива программиста»). В противном случае, какой самый удобный / быстрый способ получения этой информации?

1 Ответ

0 голосов
/ 15 сентября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...