Узнайте исходный файл (номер строки), где была инициализирована глобальная переменная? - PullRequest
0 голосов
/ 23 сентября 2019

У меня довольно большая C++ база кода разделяемой библиотеки, которая перепутана со сложными условными макросами-спагетти, поэтому у IDE есть проблемы с этим.Я проверил его с помощью GDB, чтобы найти начальное значение глобальной переменной следующим образом:

$ gdb libcomplex.so

(gdb) p some_global_var
$1 = 1024

Итак, я выяснил значение, с которым была инициализирована переменная.

ВОПРОС: Можно ли узнать, к какому исходному файлу (и, возможно, к номеру строки) он был инициализирован с помощью GDB?

Я пытался list some_global_var, но он просто ничего не печатает:

(gdb) list some_global_var 
(gdb) 

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Таким образом, на x86 вы можете поместить ограниченное количество аппаратных средств watchpoint s в эту изменяемую переменную:

Если вам повезет, в глобальном масштабе вы можете обойтись с

watch some_global_var

Но отладчик может все же решить, что это не фиксированный адрес, и сделать программную точку наблюдения.

Итак, вам нужно получить адрес и посмотреть, что именно:

p &some_global_var
(int*)0x000123456789ABC
watch (int*)0x000123456789ABC

Теперь, когда вы r начинаете, отладчик должен появиться при первой инициализации значения, возможнов ноль и / или когда он инициализируется неожиданным значением.Если вам повезет, список соответствующего исходного кода расскажет вам, как он был инициализирован.Как уже говорили другие, вам, возможно, потребуется выяснить, почему эта строка кода генерирует это значение, что может быть проблемой со сложными макросами.

Если это вам не помогает или неожиданно останавливается во время запуска, затем вы должны сначала dis включить точку наблюдения, затем starti, чтобы перезапустить вашу программу и остановить как можно скорее.Затем p ваш глобал, и если он еще не имеет магического значения, en может активировать точку наблюдения и c продолжить.Надеюсь, это пропустит ненужный запуск и увеличит значение проблемы.

1 голос
/ 25 сентября 2019

Вы можете использовать rr (https://rr -project.org / ), чтобы записать трассировку программы, затем вы можете выполнить ее в обратном порядке, чтобы найти местоположение.Например:

rr replay
(gdb) continue
...
(gdb) watch -l some_global_var
(gdb) reverse-continue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...