我目前正在研究一些日志代码,它们应该 - 除其他外 - 打印有关调用函数的信息.这应该相对容易,标准C++有一个type_info类.它包含typeid'd类/函数/ etc的名称.但它被破坏了.它不是很有用.即typeid(std::vector<int>).name()回归St6vectorIiSaIiEE.
有没有办法从中产生有用的东西?就像std::vector<int>上面的例子一样.如果它只适用于非模板类,那也没关系.
该解决方案应该适用于gcc,但如果我可以移植它会更好.这是为了记录所以它不是那么重要,它不能被关闭,但它应该有助于调试.
我可以在使用时以编程方式从共享库(仅限Linux)获取所有函数名称的列表dl_open()吗?
我想要这样的东西:
std::vector<std::string> list_all_functions(void *dl) {
//... what can I do here?
}
int main() {
void * dl = dl_open("./mylib.so", RTLD_NOW);
auto functions = list_all_functions(dl);
//...
dl_close(dl);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
示例库(mylib.so)
标题(.h):
extern "C" {
int sum (int a, int b);
}
Run Code Online (Sandbox Code Playgroud)
来源(.c):
int sum (int a, int b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)
我知道的肮脏的黑客:使用nm或objdump实用