问题标签 [debug-information]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 在动态加载的程序集中嵌入调试信息
我在 .Net 4.7.2 中使用带有嵌入式调试信息的程序集。如果从文件系统加载程序集,则异常堆栈跟踪包含行号。但是,如果我动态加载(通过 AppDomain.Load (byte[]))带有嵌入式调试信息的程序集,则异常堆栈跟踪不包含此程序集的行号。
有没有办法强制 .Net Framework 使用来自动态加载的程序集的嵌入式调试信息?
注意:我知道如果调试信息位于单独的 PDB 文件中,则可以将其与程序集本身一起加载(通过 AppDomain.Load (byte[], byte[]))。问题是关于嵌入式调试信息。
c++ - GCC:在调试版本中优化的静态数据成员
考虑以下简单代码:
我用 GCC (8.3.0, 9.1.0, ) 编译它g++ -g -O0 test.cpp
,然后运行 GDB 来检查 的值d
:
d.v
不见了...我尝试使用-ggdb
, -ggdb3
,-fvar-tracking
但没有成功。
如果我用 clang ( clang++ -g -O0 test.cpp
) 编译,我会看到预期的结果:
Base
如果不是模板类,则使用 GCC 也会看到此输出:
去哪儿了d.v
?为什么优化出来了?是否可以在不修改源代码的情况下阻止这种优化?
debugging - 包含相似地址但不同源行的 GDB 回溯
我试图调试并在其主共享库(即, )inkscape
中的地址处放置一个断点。/usr/lib/inkscape/libinkscape_base.so
当执行到达该断点时,回溯如下:
可以看出,#0
和#1
指向相同的地址但不同的源位置。#2
和也是如此#3
。这怎么可能?
gdb - fedora 中的 debuginfo 处理,如何删除 debuginfo
我可以简单地为几个包安装调试信息,例如:
但我没有看到任何删除调试信息的命令。
是否有任何可以删除调试信息的 dnf 命令?
我知道只要知道名称,我就可以使用 dnf 手动删除任何包。但是我无法自动找出软件包和调试信息与该软件包之间的关系以进行删除/卸载。
有什么诀窍可以完成这项工作吗?
visual-c++ - LLVM 调试元数据中的“retainedNodes”是什么?
使用 LLVM 8.0.1 库,我尝试使用以下代码为函数创建调试信息:
但是,这会导致 IR 如下所示:
哪个,在调用时DebugBuilder->finalize()
,抛出Assertion failed: !N->isTemporary() && "Expected all forward declarations to be resolved"
我在官方参考资料和其他教程中都没有找到该retainedNodes
字段的描述,并且网络搜索只会导致 LLVM 源代码中未注释的部分。这个领域的意义或目的是什么?临时节点是如何在那里创建的?
rust - 在 Rust 中使用 BPF 打印堆栈跟踪时缺少/未知符号
我正在使用memleak BCC 工具来跟踪我的 Rust 代码中的内存分配,但我注意到我的很多堆栈跟踪似乎不完整或缺少符号名称。阅读 Brendan Gregg 的 BPF 性能工具一书,似乎有两个常见原因是省略了堆栈帧指针和从二进制文件中删除了调试符号。
我相信我已经在我的 Rust 构建中设置了正确的设置来修复这两个:编译我的代码作为RUSTFLAGS="-Cforce-frame-pointers=yes" cargo build --release
前者,并在我的 Cargo.toml 中为后者设置以下部分:
这就是file
我正在运行/跟踪的二进制文件的原因:
不知道这里可能还有什么问题。memleak
缺少符号的输出的一些示例:
并且缺少堆栈跟踪:
对于后一点,让我感到困惑的主要事情是为什么堆栈跟踪开始而Connection
不是向我展示导致Connection
调用的原因?我想知道这是否可能是由于如何在堆栈上跟踪网络请求和/或如何实现 Rust 期货的细节?
debugging - 无法在 GDB 的 Rust 程序中获取“main”的当前行
即使在启用调试信息的情况下进行编译,例如cargo build
使用 dev 配置文件的常规,似乎也无法查找当前执行的源代码行。
重现,生成一个新项目,带货物;示例项目就足够了。
与没有任何问题的 C 相比:
我做错了什么,我的系统有问题(在撰写本文时是最新的 Arch),还是 Rust 本身的问题?
gdb - gdb 可以打印扩展的预处理器/宏结果吗?
例如:
在 gdb 中,
我怎么知道C
是什么?可以gdb
告诉我吗?(我添加了rand()
所以我们不能轻易推断它是什么)
预处理器将 C 替换为(20+22)
. 这个值在 debuginfo 中是否可以以某种方式打印?
在宏可能非常复杂的实际示例中,我不想浪费时间做预处理器的工作。
eclipse - Eclipse 在调试期间无法找到源代码
我正在使用 docker 中的 gcc 为 arm 控制器构建我的 c/c++ 应用程序。与 .hex 和 .bin 文件一起生成的还有 .elf 文件。一旦生成,它们都会从容器中导出到主机。现在我想用 openocd、arm-none-eabi-gdb 和 eclipse cdt 调试应用程序。我能够在目标板上启动调试会话,但是当我停止调试器(或者它在主启动时停止)时,它无法找到要显示的源文件:
这里的路径是docker容器中的构建项目之一,与现在所有文件所在主机上的新调试项目无关。我试图在 Eclipse 中编辑源查找路径,但没有成功,我可以找到该文件,然后它只适用于该文件。也指定文件夹不起作用。无论如何,始终为项目中的所有文件/文件夹手动执行此操作不是一种选择。
解决方案应该是“脚本化的”,因为所有这些都是 CI/devops 概念的一部分。
似乎“错误”的路径是硬编码在 elf 文件中的。是否有(脚本)方法来更改该路径以匹配实际项目位置,以便 eclipse 和 gdb 按预期工作,并且开发人员可以在调试时看到调试信息?
可能它应该适用于 Linux 和 Windows ;-)
在此先感谢您的帮助
马丁
c++ - 我可以内联应用到源位置信息吗?
我正在用类似 C 的语言编写代码,并且正在使用一个inline
实际上倾向于内联的函数。但是,根据编译器添加的调试信息(例如,GCC 添加的 DWARF),内联会维护该函数源中的位置。
是否可以让编译器内联函数的代码,同时将指令归因于内联函数的行?
为了讨论起见,假设我正在编写 C++ 并在 Linux 上使用 GCC 进行编译(尽管更一般的答案值得赞赏。)
(动机与分析有关,您只对您所在的函数进行采样,但不对整个堆栈进行采样。)