Я хочу использовать backtrace () и получить адрес функции для цели трассировки. Я хочу сохранить адрес функции из backtrace () во время выполнения и использовать его для последующего анализа (например, загрузить имя функции назад, посмотреть статистику вызовов и т. Д. С помощью dladdr ()). При этом я пытался посмотреть на статический адрес функции-члена класса.
Alib.so, A.h:
class A
{
public:
void print_addr();
};
a.cpp
#include "A.h"#include <iostream>
void A::print_addr()
{
std::cout << (void*)&A::print_addr << std::endl;
}
main.cpp
#include <iostream>
#include "Alib/A.h"
int main()
{
std::cout << (void*) &A::print_addr << std::endl;
// if put the line below, with the line above, output is the same
// It seems whenever the code pull in &A::print_addr into main, addr is
// always the same. Only different if print .so itself
// A a; a.print_address();
return;
}
это выводит:
0x400870
Если я перезапущу основной файл несколько раз, он даст мне тот же адрес.
Если я изменю main.cpp на это:
int main()
{
A a;
a.print_addr();
return 0;
}
Выходные данные меняются каждый раз, когда я запускаю основной исполняемый файл, даже без перекомпиляции .so или main:
0x7fae48524aa0
Причина, по которой я проверяю это, заключается в том, что я хотел бы использовать backtrace (), чтобы получить информацию о функции (адрес) текущей функции стека для трассировки, и она действует очень похоже. Я попытался вызвать backtrace () внутри библиотечной функции .so и получить символьную информацию о функции, используя backtrace () и dladdr () в текущей функции стека. Печать адреса функции в .so по сравнению с выполнением в main дает другой адрес. Как я могу использовать адрес функции для dladdr () для получения информации, такой как имя символа?
Есть ли что-то, чтобы адрес функции-члена класса отображался по-разному в .so и в main ()?
РЕДАКТИРОВАТЬ: Перефразировать и дать больше примеров кода, чтобы объяснить проблему.
Задача ещё не решена.
Других решений пока нет …