首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调试期间在lldb中获取类静态成员函数地址:解释器无法在执行期间解析值

调试期间在lldb中获取类静态成员函数地址:解释器无法在执行期间解析值
EN

Stack Overflow用户
提问于 2019-08-06 04:40:39
回答 1查看 206关注 0票数 0

在lldb中调试时,我可以毫无问题地获取全局函数的地址。例如,我有以下代码:

代码语言:javascript
运行
复制
#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下运行此程序:

代码语言:javascript
运行
复制
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 (*)()) $0 = 0x0000000100001100 (ex43`globalDoWork() at ex43.cpp:4)
(lldb) next
global: 0x100001100

并获取地址,但我不能用类的静态成员函数进行同样的操作:

代码语言:javascript
运行
复制
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

有什么问题吗?我该怎么做呢?

EN

Stack Overflow用户

回答已采纳

发布于 2019-08-06 09:01:45

有意思的。调用该函数是可行的:

代码语言:javascript
运行
复制
(lldb) expr Dummy::doWork()
Do work call

但是我们没有正确地将静态方法的值作为函数指针输出。请向http://bugs.llvm.org提交有关此问题的bug。

请注意,lldb确实有更简单的方法来查找符号的地址,如果这是您想要做的全部。这是image lookup命令的工作:

代码语言:javascript
运行
复制
(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
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57365820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档