Я делаю посмертный анализ сбойной программы. Я нахожусь на Linux (Ubuntu 12.04, x86), код написан на C ++. Программа использует некоторые синглтоны, которые могут содержать ценную информацию. Можно ли найти указатель на экземпляр синглтона, если он был создан так:
SingletonType& SingletonType::getInstance(){
static SingletonType* instance = new SingletonType();
return *instance;
}
И если это возможно, как это делается в GDB?
Запустите gdb с файлом core и выполните команду
disassemble SingletonType::getInstance
На моей тестовой программе я нашел mov 0x<addr>, %eax
Инструкция в конце метода. print *(*(SingletonType**) <0xaddr>)
должен напечатать содержимое вашей синглтон-структуры.
show modules
1 должен, вероятно, сказать вам базовые адреса, и instance
, будучи статически распределенным, должен быть виден в некотором objdump
/nm
отчет. Ага волосатая математика
Альтернативой было бы разобрать SingletonType::getInstance()
и посмотрите, какой эффективный адрес загружается в пути инициализации / возврата.
1 Ммм не может найти точное совпадение, которое я запомнил. info sharedlibrary
получил бы больше информации.
это то, что я делаю, находясь внутри ядра с помощью gdb:
(gdb) info var instance
это перечислит все адреса всех экземпляров синглетонов, среди которых вы найдете один из SingletonType
0x86aa960 SingletonType::getInstance()::instance
Теперь, когда у меня есть адрес, вы можете напечатать указанную память вашего экземпляра:
(gdb) p *((SingletonType*)0x86aa960)