有没有办法在 C++ 源代码中嵌入一个字符串,该字符串将显示在核心转储中?

Is there a way to embed a string in C++ source code that will show up in a core dump?

对于很多版本的二进制文件,如果我收到核心转储,我目前依赖于发件人告诉我它们是 运行 的版本,这样我就可以将它与正确的 source/symbols 匹配建造它。它们通常是不正确的,并且浪费了很多时间。即使要求他们发送带有核心的二进制文件也很容易出错。有没有办法将版本字符串嵌入到我可以在核心转储中查找的源代码中?或者是否有某种 hash/signature 我可以用来从构建中匹配它?或者有更好的约定吗?

您的 main 可以调用生成的 int build6278() 函数然后调用您的真实入口点吗?您的构建系统需要为每个版本生成不同名称的存根。

那你只需要查找调用栈,找到这个函数名就可以了。这假设构建带有符号。

或者,使用您的建议:

int main()
{
    const char* version = g_Version; // that symbol will have to be added by your build system
    std::cout << g_Version << std::endl;
    return regularMain();
}

应该允许您检查故障转储中的本地 version 指针。

I currently rely on the sender telling me the version they were running so I can match it with the right source/symbols that built it.

既然你在谈论 core 转储,你似乎极有可能正在使用 ELF 平台(可能 Linux)。

在 ELF 平台上, 识别二进制文件的标准方法是使用 --build-id 链接器标志,它将唯一的校验和嵌入到二进制文件中。默认情况下,这可能会从 g++ 传递给链接器,但您也可以使用 -Wl,--build-id 显式指定该标志。

Linux 内核保存包含 NT_GNU_BUILD_ID ELF 注释的页面,这允许您

  1. 立即确定产生核心的二进制文件(使用例如eu-unstrip -n --core core)和
  2. 使用 GDB 自动 加载正确的调试信息。参见 this article.