linux — поиск указателя на одноэлементную посмертную запись в GDB (C ++)

Я делаю посмертный анализ сбойной программы. Я нахожусь на Linux (Ubuntu 12.04, x86), код написан на C ++. Программа использует некоторые синглтоны, которые могут содержать ценную информацию. Можно ли найти указатель на экземпляр синглтона, если он был создан так:

SingletonType& SingletonType::getInstance(){
static SingletonType* instance = new SingletonType();
return *instance;
}

И если это возможно, как это делается в GDB?

4

Решение

Запустите gdb с файлом core и выполните команду

disassemble  SingletonType::getInstance

На моей тестовой программе я нашел mov 0x<addr>, %eax Инструкция в конце метода. print *(*(SingletonType**) <0xaddr>) должен напечатать содержимое вашей синглтон-структуры.

3

Другие решения

show modules1 должен, вероятно, сказать вам базовые адреса, и instance, будучи статически распределенным, должен быть виден в некотором objdump/nm отчет. Ага волосатая математика

Альтернативой было бы разобрать SingletonType::getInstance() и посмотрите, какой эффективный адрес загружается в пути инициализации / возврата.


1 Ммм не может найти точное совпадение, которое я запомнил. info sharedlibrary получил бы больше информации.

3

это то, что я делаю, находясь внутри ядра с помощью gdb:

(gdb) info var instance

это перечислит все адреса всех экземпляров синглетонов, среди которых вы найдете один из SingletonType

0x86aa960 SingletonType::getInstance()::instance

Теперь, когда у меня есть адрес, вы можете напечатать указанную память вашего экземпляра:

(gdb) p *((SingletonType*)0x86aa960)
0
По вопросам рекламы [email protected]