以编程方式获取调试信息

2023-12-31

Using

#include <execinfo.h>

人们可以访问用于展开堆栈的方法,至少在大多数 Linux 配置上是这样。但是,这允许将 char * 获取到某些 NTBS(空终止字节字符串),该 NTBS 显示一些信息,但不是全部信息,尤其是:

  • 文件名
  • 行号
  • 函数名称

我编写了一个 bash 脚本,它可以使用 objdump 和指令的文本地址推断出行号和文件,但是它的使用很乏味,因为我必须手动将多个堆栈帧的地址复制粘贴到其中。

鉴于 g++ 允许使用 -g 命令行选项包含调试符号,我如何以编程方式在 C++ 中解析和访问它们?像 gdb 和 valgrind 这样的调试器也能够在运行时以某种方式访问​​这些信息:我假设他们为此使用一些库,或者如果他们自己实现它,则将功能导出为 API。例如,valgrind 在 include/pub_tool_debuginfo.h 中定义了一些有趣的函数声明。不幸的是,我找不到其他东西。我创建了这个作为起点:

#include <execinfo.h>

namespace stck {


class stacktrace_t {};

stacktrace_t stacktrace;

std::ostream &operator<<(std::ostream &out, stacktrace_t) {
  out << "stacktrace:\n";

  size_t max = 256;
  void **stackframes = new void *[max];
  size_t numel;
  while ((numel = backtrace(stackframes, max)) >= max) {
    max *= 2;
    delete[] stackframes;
    stackframes = new void *[max];
  }

  char **symbols = backtrace_symbols(stackframes, numel);
  for(size_t i = 0; i < numel; ++i)
    out << symbols[i] << '\n';

  delete[] stackframes;
  return out;
}


}

source: http://ideone.com/RWoADT http://ideone.com/RWoADT

是否有任何建议附加此代码以输出人类可读的调试信息?

请注意,我正在实现此功能以与 mex 一起使用,mex 是一个使用 g[++|cc] 的 matlab 编译器。每当我使用该功能时,程序都处于“良好”状态,即检测到错误,但注意到确实发生了;就像分段错误一样。

例如,可以检查 sqrt 的参数是否非负,如果不是,则使用 stck::stacktrace 来显示发生这种情况的位置。

update

我认为这些信息在运行时不能直接获得(虽然我不确定),但只能在可执行文件中获得file,不在可执行文件中text在记忆中。 (如果我错了,请纠正我。

因此我认为没有办法解析可执行文件file,例如通过 addre2line:

namespace stck {

std::string getstackframe(char *frame) {
  std::string fr(frame);
  size_t loc0 = fr.find("(");
  size_t loc1 = fr.find(")");
  std::stringstream ss;
  ss << "addr2line -e " << fr.substr(0, loc0) << " -pfC " << fr.substr(loc0 + 2, loc1 - loc0 - 2);

  FILE* pipe = popen(ss.str().c_str(), "r");
  char buffer[128];

  std::stringstream result;
  while(!feof(pipe))
    if (fgets(buffer, 128, pipe) != NULL)
      result << buffer;

  pclose(pipe);
  return result.str();
}

class stacktrace_t {};

stacktrace_t stacktrace;

std::ostream &operator<<(std::ostream &out, stacktrace_t) {
  out << "stacktrace:\n";

  size_t max = 256;
  void **stackframes = new void *[max];
  size_t numel;
  while ((numel = backtrace(stackframes, max)) >= max) {
    max *= 2;
    delete[] stackframes;
    stackframes = new void *[max];
  }

  char **symbols = backtrace_symbols(stackframes, numel);
  for(size_t i = 0; i < numel; ++i)
    out << getstackframe(symbols[i]);

  out << '\n';

  delete[] stackframes;
  return out;
}


}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式获取调试信息 的相关文章

  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • 命名管道客户端无法连接到作为网络服务运行的服务器

    我有一个服务在网络服务帐户下运行 该服务只是设置一个命名管道并侦听连接 NamedPipeServerStream listeningPipe new NamedPipeServerStream ourservicepipe PipeDir
  • 表达式访问者仅为某些 lambda 表达式调用 VisitParameter

    我希望能够使用嵌套扩展方法将 EF 中的实体投影到相应的视图模型 参见我之前的问题使用扩展方法在 EF 中投影单个实体 https stackoverflow com questions 39585427 projection of sin
  • OpenCV SVM 给出奇怪的预测结果

    我对 OpenCV 和支持向量机都很陌生 我想使用 SVM 训练具有两个标签的数据集 然后预测给定集合的标签 我当前的集合包含大约 600 行 具有相等的类分布 1 为 300 行 1 为 300 行 包含 34 列 这是我当前用于设置 O
  • 如何用另一个静态变量初始化一个静态变量?

    静态1 hpp include
  • 更改图像颜色与透明背景

    我需要使用 c System Drawings 将透明背景上带有绿色圆圈的图像加载到位图图像中 这是最简单的部分 但是 我需要在将其添加到更大的图像之前更改圆圈的颜色 而不影响周围的透明度 就我而言 我需要将圆圈颜色更改为黄色并将其添加为太
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • 使用 FromBase64Transform 解码 base64 文件流

    The example https msdn microsoft com en us library system security cryptography frombase64transform 28v vs 110 29 aspx从M
  • 将旧的 Unity 代码升级到 Unity 5

    在触发按钮上播放动画的代码似乎不起作用 我在 Youtube 上看到了一个视频 内容很简单animation Play 它可以在该视频上运行 但我无法让它在我的计算机上运行 我做错了什么还是团结改变了它 请帮助我在网上找不到解决方案 所有
  • 解析连接字符串

    是否有标准库或代码片段可以使用这样的连接字符串获取值 string connstr DataServiceUrl http localhost foo RemoteServerConnection server http localhost
  • 如何解决 boost::multi precision::cpp_dec_float 除法错误

    除以boost multiprecision cpp dec float有某种舍入误差 如下 include
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • 如何使用 .NET 捕获我的桌面视频?

    我想知道是否有任何方法可以使用 NET 捕获我的桌面的视频 截屏视频 我并不是在寻找截屏软件 而只是在寻找一种可以让我自己生成桌面视频的技术 我想过拍摄多个屏幕截图 但我不确定如何以编程方式生成带有图像序列的视频 有人有主意吗 Thanks
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • 如何在 Django 中拥有这样的 URL?

    我怎样才能有这样的网址example com category catename operation 在姜戈 此外 在某些情况下 用户输入空格分隔的类别 我该如何处理 例如 如果用户输入 我的家 类别 则该类别的 URL 将变为exampl
  • 在 Azure Cosmos DB 中使用 Gremlin 重命名属性

    我们的一些代码库已经更改 因此它现在期望过去具有名称为 Sdg 的属性的顶点现在具有名称为 causeType 且具有相同值的属性 简而言之 财产的重命名 在这一点上我已经尝试了很多 而且 令我有点惊讶的是弄清楚如何搜索图表并在需要时进行重
  • 即使 JSON 已建立索引,查询中是否也需要分区键

    我计划使用 Cosmos Db 文档 Db 并且尝试了解查询 索引和分区如何相互关联 如何在 Azure Cosmos Db 中进行分区和缩放 https learn microsoft com en us azure cosmos db
  • 带有要排列的行的标量

    如何转换包含数组中带有换行符的字符串的标量 并将这些行作为元素 例如 考虑到这一点 lines line 1 nline 2 nline 3 n 我想检索这个 lines 0 gt line 1 n lines 1 gt line 2 n
  • 有什么办法可以在网页上显示C++吗?

    有没有一种相对简单的方法可以在网页上显示 C 程序的输出 我并不是指手动 换句话说 您在网页上看到它 因为它运行 而不是像我制作代码标签并自己编写它一样 编辑 为了让每个人都能清楚地了解这一点 我将把它发布在这里 我不想用 C 制作网页 如
  • 根据索引初始化 MATLAB 矩阵

    我正在尝试创建一个满足以下条件的矩阵 M M i j f i j 对于一些f 我可以通过说进行元素初始化M zeros m n 然后循环 例如 八度 M zeros m n for i 1 m for j 1 n m i j i j 2 e
  • 如何将 C# 文档生成为 CHM 或 HTML 文件?

    有没有办法直接从 Visual Studio 中从代码文档生成可读文档文件 也考虑2010年 代码示例
  • 在父类中记录静态方法

    我有一个抽象类 Parent 有 2 个子类 A 和 B Parent 有一个名为 do 的静态方法 我想知道是否有一种方法可以让该静态方法在 A 类被称为 A do 时在 Logger 中添加日志信息 在被称为 B do 时在 Logge
  • PHP Exception::getCode() 与其实现的 Throwable 接口相矛盾

    我发现了一个我无法理解的矛盾 异常 getCode https www php net manual en exception getcode php 有这样的定义 final公共异常 getCode 无效 mixed 附说明 返回异常代码
  • 什么存储位置(SQL Server 或文件系统)可以提高保存 tiff 图像的性能?

    我们的系统需要存储大小约为 3k 的 tiff 图像 我们在给定时间收到约 300 张图像 需要快速处理它们 一旦收到约 100 000 张图像 这些图像就会从我们的系统转移到另一个存档系统或被清除 我正在寻找图像文件初始保存的最佳性能 传
  • 有没有关于 gremlin 'match()' 如何工作的文档?

    我正在用 match 遍历编写 gremlin 查询 某些模式匹配的行为似乎与其他模式语言不同 输入遍历器值如何与模式变量绑定 g V A B match as x as y project x y gt x v A y v A gt x
  • 使用summary r 进行逻辑值计数

    在数据框中 我有一列包含 Y 和 N 值 该数据框还有一个 id 列 我想创建两列 一列包含 Y 总数 另一列包含每个 id 的 N 总数 我尝试使用 dplyr summarise 函数执行此过程 group by id gt summa
  • Polymer 2.0 webcomponents-loader.js 缺少 Edge polyfill

    我们目前将项目从 Polymer 1 更新到 Polymer 2 混合版本 我知道 webcomponents hi sd ce js 是 Edge 的 polyfill 在 Microsoft Edge 上测试页面时 我现在收到一条错误
  • 服务器端验证 Facebook 用户

    我正在编写一个 Facebook 应用程序 其中列出了用户的朋友 并与用户提供的有关他们的信息 存储在 Google App Engine 数据库中 进行交叉引用 我的应用程序的运行方式如下 用户登录 Facebook 后 通过 Faceb
  • 如何在页面刷新时保留无线电输入状态

    我有一个表单 如果用户提交有错误的表单 以防页面刷新 我需要在该表单上存储所有单选按钮的状态 我想实现与此非常相似的目标 function example input type radio checked each function thi
  • 如何检查复制快照代理状态?

    我想在使用此语句启动代理后检查代理的状态 EXEC sp startpublication snapshot publication 因为我想做下一步 需要工作已经开始 我不相信有内置复制存储过程来检查快照代理状态 我可能是错的 但是 您可
  • 将 Maven 输出发送到文件

    在 Windows 7 上 我尝试发送maven 3命令到文本文件 我从我试图分析的项目的根目录调用该命令 命令是 mvn dependency tree Dverbose Dincludes commons collections Dou
  • 具有零值双精度的奇怪 if 语句行为

    有人愿意向我解释一下它的价值吗this oBalance QouteBalance因小于零而被评估为真 但显然不是 请参见下图 在比较 C 中的双精度数时 我是否遗漏了一些基本的东西 public double QouteBalance g
  • 如何使用apache Spark的MLlib的线性回归?

    我是apache Spark的新手 从MLlib的文档中 我找到了scala的示例 但我真的不知道scala 有人知道java中的示例吗 谢谢 示例代码是 import org apache spark mllib regression L
  • 以编程方式获取调试信息

    Using include