Есть ли способ изменить переменную-член в коде релиза на Linux во время работы программы? - PullRequest
3 голосов
/ 22 мая 2011

Я написал программу, которая решает какую-то проблему оптимизации.Я запускаю его со все более низкими порогами, и я думаю, что столкнулся с каким-то барьером, так как моя программа не может добиться лучших результатов.Он работал около 5 дней ...

Однако у меня есть некоторый код в программе, который сохраняет свои данные, если он лучше, чем пороговое значение.Поскольку я не заинтересован в том, чтобы запустить его снова в течение 5 дней, я хочу сделать это во время работы программы, но, к сожалению, я не скомпилировал ее с -g (я использую gcc).Я пытаюсь изменить пороговое значение на более высокое.

Мне удалось подключиться к нему с помощью gdb и увидеть кадр стека.Сейчас я нахожусь внутри метода, и я хочу получить доступ к указателю «this», чтобы изменить пороговый параметр.Я пытался исследовать значения вокруг адреса функции, но ничего не имеет смысла ... Как узнать, на что указывает "this"?

Спасибо.

1 Ответ

3 голосов
/ 22 мая 2011

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

Вы должны перестроить ее, используя точно те же источники и флаги, которые вы использовали изначально и добавить -g.Это даст вам исполняемый файл, который содержит отладочную информацию, но в остальном он (почти) идентичен исходному двоичному файлу.Выходные данные nm a.out и nm a.out.debug должны быть очень близки (некоторые незначительные различия, вероятно, будут присутствовать, но, вероятно, не повлияют на отладку).Теперь запустите gdb a.out.debug <pid>, и вы сможете выполнять отладку на уровне исходного кода и настроить свой порог.

Если это не удастся, вы все равно можете делать то, что хотите, но это будет сложнее: у вас будетсделать это на уровне сборки.Вы можете запустить a.out.debug (запустить новую задачу) и посмотреть в выводе GDB disas, как параметры передаются в вашу подпрограмму и как осуществляется доступ к порогу.Затем вы можете вернуться к исходному исполняемому файлу и наблюдать, по существу, то же самое, что происходит там.Как только вы узнаете, где в памяти находится порог, вы сможете настроить его в GDB.

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