gpt4 book ai didi

c++ - 给定一个包含 lambda 函数的调用堆栈,如何确定其来源?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:28 26 4
gpt4 key购买 nike

假设您有一些代码像这样推送到队列中:

template <typename T>
void submitJobToPool(T callable)
{
someJobQueue.push(callable)
}

...及以后:

template <typename T>
void runJobFromPool(T callable)
{
auto job = someJobQueue.pop();
job();
}

现在假设代码由于 job() 调用中的某些错误而崩溃。如果提交的作业是一个普通函数,调用堆栈可能如下所示:

void myFunction()     0x345678901
void runJobFromPool() 0x234567890
int main(int, char**) 0x123456789

在这里很容易看出哪个函数崩溃了。如果它是一个仿函数,它会很相似,但在某处有一个 operator()(忽略内联)。但是,对于 lambda...

void lambda_a7009ccf8810b62b59083b4c1779e569() 0x345678901
void runJobFromPool() 0x234567890
int main(int, char**) 0x123456789

这不是那么容易调试的。如果在它发生时附加了调试器,或者有可用的核心转储,则可以使用该信息来推导哪个 lambda 崩溃,但该信息并不总是可用。据我所知,反汇编是确定崩溃原因的少数几种方法之一。

我必须使它变得更好的想法是:

  1. 如果平台支持,则使用类似addr2line 的工具。这有时有效,有时无效。
  2. 将所有 lambda 包含在仿函数中(至少可以说并不理想)。
  3. 不使用 lambda(同样,不理想)。
  4. 使用编译器扩展为 lambda 赋予更有意义的名称/添加调试信息。

第四个选项听起来很有希望,所以我做了一些调查,但找不到任何东西。如果重要,我可用的编译器是 clang++ 5.0 和 MSVC 19 (Visual Studio 2015)。

我的问题是,还有哪些其他工具/技术可以帮助将其中包含 lambda 函数的调用堆栈映射到相应的源代码行?

最佳答案

恐怕这是不可能的。您应该设计自己的技术来在 lamda 中存储所需的信息。您的选项 2 适合此处。你可以看看它是如何谷歌的:https://cs.chromium.org/chromium/src/base/task_scheduler/post_task.h

下面是非常原始的方法 (https://ideone.com/OFCgAq)

#include <iostream>
#include <stack>
#include <functional>

std::stack<std::function<void(void)>> someJobQueue;

template <typename T>
void submitJobToPool(std::string from_here, T callable) {
someJobQueue.push(std::bind([callable](std::string from_here) { callable(); }, from_here));
}

void runJobFromPool() {
auto job = someJobQueue.top();
someJobQueue.pop();
job();
}

int main() {
submitJobToPool(__func__, [](){ std::cout << "It's me." << std::endl; });
runJobFromPool();
return 0;
}

不幸的是,您不会看到完美的调用堆栈。但是您可以在调试器中看到 from_here

void lambda_1a7009ccf8810b62b59083b4c1779e56() 0x345678920
void lambda_a7009ccf8810b62b59083b4c1779e569() 0x345678910 <-- Here `from_here` will be available: "main"
void runJobFromPool() 0x234567890
int main(int, char**) 0x123456780

关于c++ - 给定一个包含 lambda 函数的调用堆栈,如何确定其来源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com