问题标签 [backtrace]
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.
macos - 在 Mac OS X 上获取当前堆栈跟踪
我正在尝试研究如何在 Mac OS X 上的 C++ 应用程序中存储并打印当前堆栈。主要问题似乎是让 dladdr 在主可执行文件中给出地址时返回正确的符号。我怀疑这个问题实际上是一个编译选项,但我不确定。
我已经尝试过来自 Darwin/Leopard 的回溯代码,但它调用了 dladdr,并且与我自己的调用 dladdr 的代码有相同的问题。
原始帖子:目前我正在使用以下代码捕获堆栈:
这似乎工作正常。然后使用 dladdr 打印我正在查看的堆栈,如下所示:
这几乎可以工作,一些示例输出:
它为共享对象获取方法名称,但不适用于主应用程序。那些只是映射到“tart”(或“start”减去第一个字符)。
理想情况下,我想要行号以及此时的方法名称。但我会为初学者选择正确的函数/方法名称。也许在那之后拍摄行号,在 Linux 上,我听说您必须为具有自己的指令集的私有 ELF 块编写自己的解析器。听起来很吓人。
无论如何,任何人都可以对这段代码进行排序,以便正确获取方法名称吗?
c - Is there a cheaper way to find the depth of the call stack than using backtrace()?
My logging code uses the return value of backtrace() to determine the current stack depth (for pretty printing purposes), but I can see from profiling that this is a pretty expensive call.
I don't suppose there's a cheaper way of doing this? Note that I don't care about the frame addresses, just how many of them there are.
edit: These logging functions are used all over a large code-base, so manually tracking the stack depth isn't really an option.
c++ - 如何从崩溃中提取调试信息
如果我的 C++ 应用程序在 Windows 上崩溃,我想将有用的调试信息发送到我们的服务器。
在 Linux 上,我会使用 GNUbacktrace()
功能 - Windows 是否有等效功能?
有没有办法在程序崩溃后提取有用的调试信息?还是仅来自流程内部?
(“测试你的应用程序以使其不会崩溃”的建议没有帮助!-所有非平凡的程序都会有错误)
php - 如何让 PHP 在错误时产生回溯?
尝试使用其默认的仅当前行错误消息来调试 PHP 是可怕的。产生错误时,如何让 PHP 产生回溯(堆栈跟踪)?
c++ - 奇怪的回溯——错误在哪里?
我正在用 C++ 开发一个图像处理应用程序。我见过很多编译器错误和回溯,但这对我来说是新的。
这里发生了什么事?操作员 new 崩溃了,好的。但为什么?这不是内存不足(它尝试分配大约 128Kb,一个 128x64 像素,每个像素有两个浮点数)。此外,它不会接缝,因为它是我自己的代码中的错误(构造函数没有被触及!)。
上述行(#7)中的代码是:
几乎相同的实例化适用于我代码中的其他地方。如果我注释掉这部分代码,它会在稍后的类似部分崩溃。我不明白,我也没有任何想法,如何调试它。有什么帮助吗?
编译器是 gcc 4.3.3,libc 是 2.9(都来自 Ubuntu Jaunty)
更新:
我在同一方法和 main() 中的故障行上方包含以下行
奇怪的是:在相同的方法中它会崩溃,在 main() 中它不会。正如我所提到的,Complex 是 std::complex<float> 的 typedef。构造函数没有被调用,我在这一行之前和构造函数本身中插入了一个 cout。
更新 2:
感谢 KPexEA 的提示!我试过这个:
它崩溃了 - 你猜?- 测试2!所以我的kissfft接缝的malloc是有缺陷的。我会看看它。
最终更新:
好的,完成了!感谢大家!
其实,我应该早就注意到了。上周,我注意到,kissfft(一个快速傅立叶变换库)从 128x128 像素的源图像生成了 130x64 像素的 fft 图像。是的,130 像素宽,不是 128。不要问我为什么,我不知道!因此,必须分配 130x64x2xsizeof(float) 字节,而不是 128x64x ......就像我之前想的那样。奇怪的是,它并没有在我修复那个错误之后崩溃,而是在几天之后。
作为记录,我的最终代码是:
谢谢!
崩溃
c++ - 在 OS/X (10.5.7) 中生成 C++ 回溯
我一直在使用 backtrace 和 backtrace_symbols 来生成程序堆栈跟踪,以用于日志记录/诊断。它似乎大致工作,但是,我得到了一点修饰,并且没有与每个函数调用相关联的随附文件/行号(正如我在 gdb bt 调用或其他东西中所期望的那样)。这是一个例子:
1 leonardo 0x00006989 _ZN9ExceptionC2E13ExceptionType + 111
2 leonardo 0x00006a20 _ZN9ExceptionC1E13ExceptionType + 24
3 leonardo 0x0000ab64 _ZN5Rules11ApplyActionER16ApplicableActionR9GameState + 1060
4 leonardo 0x0000ed15 _ZN9Simulator8SimulateEv + 2179
5 leonardo 0x0000eec9 _ZN9Simulator8SimulateEi + 37
6 leonardo 0x00009729 main + 45
7 leonardo 0x000025c6 start + 54
任何我遗漏的东西,做一些愚蠢的事情,或者这就是我在 OS/X 上的回溯中所能期望的?
其他一些花絮:
rdynamic
我正在使用的 g++ 版本(4.0.1)的链接选项。-g/-g3
没有任何区别。
abi::__cxa__demangle
似乎什么也没做
c - 是否有用于确定帧指针未被消除的 gcc 宏?
当使用 -fomit-frame-pointer 时(自动用于各种 -O 设置),执行回溯是有问题的。我想知道是否有办法在编译时确定代码是用这个开关编译的?在这种情况下,我可以放入一个#ifndef 以防止在不明智的情况下进行回溯。
当这个 -fomit-frame-pointer 开关打开时,是否设置了任何宏?
谢谢,
SetJmp
gdb - 在 gdb 6.3 中的多个堆栈之间切换
程序中有两个堆栈:一个是由操作系统创建的,第二个是由程序本身创建的,用于运行一些代码。
当程序在第二个堆栈崩溃时,我想切换到 gdb 中的主堆栈并查看回溯。可能吗?
我试图将 rsp 保存到一个变量并在崩溃后对其进行更改,但结果回溯不正确。我认为 gdb 无法区分堆栈中的帧。
c++ - 我在哪里使用 Mac 上的 BackTrace 调用
我想从崩溃的 C++ Mac 应用程序中获取 BackTrace,但是我是 Mac 新手,不知道如何最好地去做。
我在stackoverflow上发现了一个详细说明其用法的问题:getting the current stack trace on mac os x
但是我的问题是我看不到代码应该放在哪里?
- 它在 main.cpp 中吗?
- 它是否存在于 try catch 块的 catch 部分?
我可以使用一些完整的代码示例,但找不到它们。
c - Perl 的 Carp 模块有对应的 C 语言吗?
在我用 C 完成的一些项目中,我喜欢使用以下与 Perl 的 warn 和 die 子例程类似的宏:
是否存在像 Perl 的Carp中的 carp、croak、cluck 和 admission 子例程?我想从用户的角度报告错误。
如果没有,我知道 glibc 中有 backtrace() 和 backtrace_symbols() 函数以及 -rdynamic gcc 选项可以为我提供函数名称和代码地址的回溯。但我想要更好的东西;可以访问调用堆栈中的文件、行和函数名,就像 Perl 的调用者子例程一样。有了它,我就可以编写自己的 libcarp 以在我的 c 程序中使用。
编辑:2009-10-19
我正在考虑创建一些在 basename(argv[0]) 上可用时使用 gdb 的东西,然后处理堆栈跟踪以生成我想要的不同类型的消息。它应该能够确定我是否不在可调试的可执行文件中,或者没有 gdb 的系统,在这种情况下,carp 和 cluck 将成为警告,而 craok 和承认将成为死亡。
我以前从未像这样使用过 gdb(我只在我的程序开始时运行它,而不是在它已经运行时)。但是我在 glib 中发现了一些函数(g_on_error_stack_trace 和 stack_trace),它们看起来非常接近我想要做的:它使用参数 basename(argv[0]) 和进程 id 分叉一个 gdb 进程,然后写入它的标准输入 (已被重定向到管道)命令“回溯”后跟“退出”。然后它从结果中读取并以它喜欢的方式解析它。这几乎正是我需要做的。