调试期间在 lldb 中获取 class 静态成员函数地址:解释器无法在执行期间解析值
Get class static member function address in lldb during debugging: Interpreter couldn't resolve a value during execution
在 lldb 中调试期间,我可以毫无问题地获取全局函数的地址。例如,我有以下代码:
#include <iostream>
void globalDoWork()
{
std::cout << "Global do work call\n";
}
struct Dummy
{
static void doWork()
{
std::cout << "Do work call\n";
}
};
int main(int argc, char* argv[])
{
globalDoWork();
Dummy::doWork();
std::cout << "global: " << (void*)&(globalDoWork) << "\n";
std::cout << "static: " << (void*)&(Dummy::doWork) << "\n";
return 0;
}
构建可执行文件后,我 运行 这个程序在 lldb 下:
Process 10759 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step over
frame #0: 0x00000001000011a7 ex43`main(argc=1, argv=0x00007ffeefbff8f0) at ex43.cpp:21:15
18 globalDoWork();
19 Dummy::doWork();
20
-> 21 std::cout << "global: " << (void*)&(globalDoWork) << "\n";
22 std::cout << "static: " << (void*)&(Dummy::doWork) << "\n";
23
24 return 0;
Target 0: (ex43) stopped.
(lldb) p globalDoWork
(void (*)()) [=12=] = 0x0000000100001100 (ex43`globalDoWork() at ex43.cpp:4)
(lldb) next
global: 0x100001100
并获取地址,但我不能与class静态成员函数相同的动作:
static: 0x100001220
Process 10765 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step over
frame #0: 0x0000000100001208 ex43`main(argc=1, argv=0x00007ffeefbff8f0) at ex43.cpp:24:5
21 std::cout << "global: " << (void*)&(globalDoWork) << "\n";
22 std::cout << "static: " << (void*)&(Dummy::doWork) << "\n";
23
-> 24 return 0;
25 }
Target 0: (ex43) stopped.
(lldb) p Dummy::doWork
error: supposed to interpret, but failed: Interpreter couldn't resolve a value during execution
(lldb) p (void*)&(Dummy::doWork)
error: supposed to interpret, but failed: Interpreter couldn't resolve a value during execution
有什么问题吗?我该怎么做?
有意思。调用函数有效:
(lldb) expr Dummy::doWork()
Do work call
但是我们没有正确获取作为函数指针的静态方法的值。请使用 http://bugs.llvm.org.
提交有关此问题的错误
请注意,lldb 确实有更简单的方法来查找符号的地址,如果这就是您想要做的。这就是 image lookup
命令的作用:
(lldb) image lookup -n Dummy::doWork
1 match found in /tmp/dowork:
Address: dowork[0x0000000100001100] (dowork.__TEXT.__text + 304)
Summary: dowork`Dummy::doWork() at dowork.cpp:11
在 lldb 中调试期间,我可以毫无问题地获取全局函数的地址。例如,我有以下代码:
#include <iostream>
void globalDoWork()
{
std::cout << "Global do work call\n";
}
struct Dummy
{
static void doWork()
{
std::cout << "Do work call\n";
}
};
int main(int argc, char* argv[])
{
globalDoWork();
Dummy::doWork();
std::cout << "global: " << (void*)&(globalDoWork) << "\n";
std::cout << "static: " << (void*)&(Dummy::doWork) << "\n";
return 0;
}
构建可执行文件后,我 运行 这个程序在 lldb 下:
Process 10759 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step over
frame #0: 0x00000001000011a7 ex43`main(argc=1, argv=0x00007ffeefbff8f0) at ex43.cpp:21:15
18 globalDoWork();
19 Dummy::doWork();
20
-> 21 std::cout << "global: " << (void*)&(globalDoWork) << "\n";
22 std::cout << "static: " << (void*)&(Dummy::doWork) << "\n";
23
24 return 0;
Target 0: (ex43) stopped.
(lldb) p globalDoWork
(void (*)()) [=12=] = 0x0000000100001100 (ex43`globalDoWork() at ex43.cpp:4)
(lldb) next
global: 0x100001100
并获取地址,但我不能与class静态成员函数相同的动作:
static: 0x100001220
Process 10765 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step over
frame #0: 0x0000000100001208 ex43`main(argc=1, argv=0x00007ffeefbff8f0) at ex43.cpp:24:5
21 std::cout << "global: " << (void*)&(globalDoWork) << "\n";
22 std::cout << "static: " << (void*)&(Dummy::doWork) << "\n";
23
-> 24 return 0;
25 }
Target 0: (ex43) stopped.
(lldb) p Dummy::doWork
error: supposed to interpret, but failed: Interpreter couldn't resolve a value during execution
(lldb) p (void*)&(Dummy::doWork)
error: supposed to interpret, but failed: Interpreter couldn't resolve a value during execution
有什么问题吗?我该怎么做?
有意思。调用函数有效:
(lldb) expr Dummy::doWork()
Do work call
但是我们没有正确获取作为函数指针的静态方法的值。请使用 http://bugs.llvm.org.
提交有关此问题的错误请注意,lldb 确实有更简单的方法来查找符号的地址,如果这就是您想要做的。这就是 image lookup
命令的作用:
(lldb) image lookup -n Dummy::doWork
1 match found in /tmp/dowork:
Address: dowork[0x0000000100001100] (dowork.__TEXT.__text + 304)
Summary: dowork`Dummy::doWork() at dowork.cpp:11