Адрес функции C ++ — с использованием dladdr и backtrace ()

Я хочу использовать 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 ()?

РЕДАКТИРОВАТЬ: Перефразировать и дать больше примеров кода, чтобы объяснить проблему.

0

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы [email protected]