问题标签 [debug-symbols]
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 - 如何使用 Makefile for C 生成调试符号?[Linux]
我正在尝试使用 GDB 和 KDEvelop 在 Knoppix VM 下调试控制台应用程序。KDevelop 和 GDB 不会在我的断点处中断。我怀疑这是因为它们没有调试符号。
如果我是正确的,我该如何更改我的 Makefile 来创建它们。也许问题出在其他地方?
问候, 爱丽儿
c - 如何判断一个库是否是用 -g 编译的?
我在 x86 Linux 上有一些已编译的库,我想快速确定它们是否是使用调试符号编译的。
windbg - WinDbg,显示加载模块的符号服务器路径(即使符号没有加载)?
WinDbg 有没有办法在不使用 DbgEng API 的情况下为所有加载的模块显示符号服务器路径(即PdbSig70 和 PdbAge )?
我知道
对已加载符号的模块执行此操作。我想知道未加载符号的这些路径,以便诊断问题。任何人都知道这是否可能无需使用 DbgEng API?
编辑:
我也意识到你可以使用
获取有关符号加载的错误消息。虽然这确实有有用的输出,但它与我想要的其他输出交错并且不像'lml'那样简单明了
visual-studio-2008 - WINDOWS 调试符号加载问题。我无法在 Visual Studio 中加载 WINDOWS 操作系统二进制文件 .pdb
我在一家软件公司工作,开发系统软件产品。前天该产品崩溃并显示核心。
为了找出确切的问题,我想知道带有函数名称的完整核心堆栈(kernel32.dll、ntdll.dll .. 不显示函数名称)。我已经从 Microsoft 站点下载了 WINDOWS 调试符号。 http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx#f
下载了以下三个包 1. WindowsServer2003-KB933548-v1-ia64-symbols-NRL-ENU.exe 2. WindowsServer2003-KB933548-v1-x86-symbols-NRL-ENU.exe 3. WindowsServer2003-KB933548-v1-x86-symbols- NRL-ENU-DEBUG.exe。
尝试为 WINDOWS 操作系统二进制文件加载调试符号,但我无法成功。示例:对于 ntdll.dll,我尝试加载相应的 ntdll.pdb,但 Visual Studio 出现错误,即“符号文件 ntdll.pdb 与模块不匹配”
操作系统:我使用的是 WINDOWS 2003 SP2 。
请帮助获得带有函数名称的完整堆栈。
我的系统软件崩溃后的核心堆栈。
kernel32.dll!77e4bef7() Asm [下面的帧可能不正确和/或丢失,没有为 kernel32.dll 加载符号] Asm kernel32.dll!77e4bef7() Asm kernel32.dll!77e46cfd() Asm ntdll.dll!7c827d29( ) Asm ntdll.dll!7c83d266() Asm ntdll.dll!7c83d2b1() Asm ntdll.dll!7c82d308() Asm ntdll.dll!7c82d30f() Asm ntdll.dll!7c82f380() Asm ntdll.dll!7c82d30f() Asm ntdll.dll!7c82f557() Asm ntdll.dll!7c82a501() Asm ntdll.dll!7c82daee() Asm ntdll.dll!7c82f51a() Asm ntdll.dll!7c82f2c3() Asm kernel32.dll!77e6518d() Asm ntdll。 dll!7c829cc2() Asm ntdll.dll!7c829de7() Asm ntdll.dll!7c829e02() Asm ntdll.dll!7c827899() Asm ntdll.dll!7c82ec4a() Asm msvcr80.dll!781787e4() Asm msvcr80.dll! 78178823() Asm sal.dll!SAL_DebugOutput(const char * fmtstr=0x66009318, ...) 第 643 行 C++ sal.dll!MapSystemError(unsigned long dwerr=0x00000040) 第 130 行 + 0xb 字节 C++
sal.dll!MapLastError() 第 146 行 + 0xc 字节 C++
sal.dll 是我的软件二进制文件,我能够为 sal.dll 加载调试符号。
我在等你的建议。
c# - 不要在堆栈跟踪中显示构建机器的文件路径
我目前正在开发一个 C# 应用程序,它有自己的日志记录。当抛出异常时,异常被保存到一个列表中,用户可以通过列表视图查看该列表。当用户单击列表视图中的异常时,异常的堆栈跟踪将显示在文本框中。但即使我在远程机器上执行程序,堆栈跟踪也会显示从编译应用程序的机器到原始源文件的文件路径。
例如:
只显示没有文件夹的源文件会很好......
我怎样才能改变这种行为?
有本地解决方案吗?还是我必须简单地进行一些字符串操作?
windows - 在符号服务器中没有确切版本的 Windows DLL 的事后崩溃转储调试
在我的应用程序中,每当我的应用程序崩溃时,我都会使用 MiniDumpWriteDump 函数(请参阅 dbghelp.dll)来编写崩溃转储文件。
我还使用符号服务器来存储我所有的可执行文件和 pdb 文件,这样每当客户向我发送故障转储文件时,调试器就会自动获取正确版本的可执行文件和调试信息。
我还将 Windows DLL(ntdll.dll、kernel32.dll、...)及其调试信息存储在符号服务器中(使用 SymChk)。调试信息是从 Microsoft 的公共符号服务器获取的。
大多数情况下,这很完美,除非:
- 客户在其中一个 Windows DLL 中崩溃
- 并且客户使用我没有放入符号服务器的 DLL
这是因为在 Symbol Server 中存储每个 Windows DLL 的每个风格是完全不可撤销的(尤其是每周的补丁)。
因此,如果客户崩溃了,比如说 NTDLL.DLL 的 5.2.123.456 版本,而我没有将这个确切版本的 DLL 放在我的符号服务器中,那么我就被卡住了。甚至微软的公共符号服务器也无济于事,因为它只提供调试信息,而不是 DLL 本身。
我目前的解决方案是向客户索要他的 DLL,但这并不总是那么容易。因此,我正在寻找更好的解决方案。
有没有办法让调试器显示正确的调用堆栈,或者加载特定 DLL 的调试信息,即使您没有 DLL 的确切版本?
或者,有没有办法获得所有(或重要的)Windows DLL(来自 Microsoft)的所有版本?
编辑:
与此同时,我找到了一个非常简单的方法来解决这个问题。使用实用程序 ModuleRescue(请参阅http://www.debuginfo.com/tools/modulerescue.html),您可以从 minidump 文件生成虚拟 DLL。有了这些虚拟 DLL,调试器就满足了,并正确地开始从 Microsoft 服务器加载调试符号。
java - Java jar 符号信息:tdstrip 的等价物是什么?
我有一个 1MB 的 .jar 文件。如果没有调试信息,它应该是 100KB 左右。现在,我如何剥离调试信息?
来自 borland 世界的老前辈可能还记得一个名为的工具tdstrip
,它可以从 .exe 中删除符号信息。
Java世界中的等价物是什么?我正在尝试进行 1MB 文件太大的移动开发。
我知道我可以在没有调试信息的情况下重新编译和重建 .jar 文件,但是如果你没有源等,你怎么做呢?
linux-device-driver - Linux System.map 中缺少函数名称和地址
我在 AT91SAM9263 板上进行嵌入式开发并遇到了一个奇怪的问题。它运行 debian Linux 内核 2.6.18.4,并与 arm-linux-gcc 3.4.6 交叉编译,并使用 uClibc-0.9.28 作为 C 库。我正在调试内核设备驱动程序,但 System.map 文件中没有出现特定功能。可以理解的是,因此我无法在其上设置断点。奇怪的是,如果我闯入它的调用函数,我就无法进入它——使用 gdb 的 nexti 命令执行它但跳过源代码。该函数是 atmel_rx_chars(struct uart_port *port)。它是在 atmel_serial.c 中声明的静态 void 函数,其示例出现在 [1] 中。同一文件中还有其他静态 void 函数 (atmel_tx_chars(struct uart_port *port), 例如)在同一个文件中声明并且实际上在 System.map 文件中被索引。根据 [2] “System.map 由 'nm vmlinux' 生成,并且不相关或无趣的符号被剔除。” 我尝试使用 nm(以及 objdump)来查看所有符号,但它仍然没有出现在输出中。但是,当我 grep atmel_rx_chars vmlinux 时,它会返回匹配项。我曾经认为自己是一个超级用户,但在这之后我真的很难过。任何建议将不胜感激。我曾经认为自己是一个超级用户,但在这之后我真的很难过。任何建议将不胜感激。我曾经认为自己是一个超级用户,但在这之后我真的很难过。任何建议将不胜感激。
谢谢,
杰斯
[1] http://lxr.free-electrons.com/source/drivers/serial/atmel_serial.c#L379
[2]http://www.faqs.org/docs/Linux-HOWTO/Kernel-HOWTO.html#systemmap
deployment - 部署时附带的调试符号
我想知道为什么要部署带有相关调试符号的软件。有什么优点和缺点?是否存在代码泄露问题(信息安全相关问题)?
c - 为什么 gcc 在非调试版本中添加符号?
当我使用 gcc 进行发布构建(即我没有指定-g
)时,我似乎仍然在二进制文件中得到了符号,并且不得不使用strip
它们来删除它们。事实上,我仍然可以在 gdb 中断点函数并获取回溯(尽管没有行号)。
这让我很惊讶——谁能解释为什么会这样?
例如
gcc -o foo foo.c
nm foo | grep blah
:
08048374 t blah