Обнаружить запись в строку - PullRequest
2 голосов
/ 16 февраля 2012

Есть ли для меня способ обнаружить / инициировать создание записи в строку без использования mprotect (который я не могу использовать)?

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

Примечание. Использование gdb с контрольными точками не удалось из-за того, что оптимизатор переместил строку в памяти процесса.

Редактировать: рассматриваемая переменная является членом класса (char *), который содержит некоторые метаданные в качестве префикса для строки. Строка - это та часть, которая должна быть неизменной, а префикс должен быть доступным для записи. У меня есть несколько миллионов этих объектов в статическом хэше, и они доступны практически из любого места в нашем коде.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Вы можете попытаться обернуть весь код, который пишет в память, в макросы препроцессора, которые проверяют адрес, который вы используете, но, поскольку большинство людей любят использовать указатели «голых костей» (вместо вызовов библиотеки, которые инкапсулируют объекты), он, вероятно, будет быть много усилий.

Единственным другим вариантом является mprotect(2) или GDB, которые все используют специальные части ЦП для отслеживания адресной шины для доступа к рассматриваемой памяти.

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

0 голосов
/ 16 февраля 2012

Я не уверен, есть ли в gdb команда, похожая на «trace» в dbx, но я помню, что в dbx я использовал команду «trace», которая может использоваться для отслеживания отдельных переменных в коде, и она сообщает вам, когда значение переменной изменяется в процессе выполнения.

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