问题标签 [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.
mips - SIGSEGV 上的 mips _Unwind_Backtrace
在 mips 平台上,我试图让 Unwind 工作。目前,如果我手动发出 print_trace,堆栈跟踪将正确显示如下:
backtrace_helper 0x4b6958
backtrace_helper 0x4b6ab4
backtrace_helper 0x2ac2f628
获得 3 个堆栈帧。
./v(print_trace+0x38) [0x4b6958]
./v(main+0x90) [0x4b6ab4]
/lib/libc.so.0(__uClibc_main+0x24c) [0x2ac2f628]
但是当发生 SIGSEGV 时,堆栈跟踪不会显示正确的函数调用顺序。
backtrace_helper 0x4b7a74
backtrace_helper 0x2ab9b84c
获得 2 个堆栈帧。
./v(getLineIDByPhyIdx+0x3d8) [0x4b7a74]
/lib/libpthread.so.0(__new_sem_post+0x2c8) [0x2ab9b84c]
我正在使用 -g -fexceptions -rdynamic 进行编译。我还看到了当我的 gcc C++ 应用程序崩溃时如何生成堆栈跟踪,其中第二个答案提到了错误的地址,但是当我像他一样设置但它只更改第二帧并且其余部分相同时,代码片段如下:
代码:
stack - Solaris 上损坏的堆栈回溯
有人可以解释为什么会发生以下损坏的堆栈跟踪吗?
核心来自构建在 x86 机器上的进程。如果在执行进程的机器上执行回溯,则回溯是完美的,具有完整的帧信息。但是,如果我在构建机器(另一台机器)上使用核心进行回溯,我会在上面进行跟踪。
我考虑的一件明显的事情是操作系统上的不同补丁级别一个有5.10 Generic_138889-03
(执行机器),另一个有5.10 Generic_138889-02
(构建机器)所以版本号是关闭的。会是这个原因吗?或者还能是什么?我可以做些什么来查看完整的帧信息,以便更详细地检查核心内存?
将不胜感激任何想法。
谢谢。
linux - 是什么导致 Linux 64 位上的 backtrace() 崩溃(SIGSEGV)
我正在 linux 上开发一个应用程序,我想在特定频率下对所有正在运行的线程进行回溯。所以我的用户定义的信号处理程序 SIGUSR1(对于所有线程)调用 backtrace()。
我在源自 backtrace() 调用的信号处理程序中遇到崩溃(SIGSEGV)。我已将正确的参数传递给大多数网站上指定的函数。 http://linux.die.net/man/3/backtrace。
在这种情况下,什么会使 backtrace() 崩溃?
要添加更多详细信息:
是什么让我得出结论,崩溃在回溯内部是下面的第 14 帧。onMySignal 是信号处理程序 SIGUSR1,它调用回溯。
onMySignal 的示例代码是(从 backtrace 的 linux 文档中复制)
希望这会使问题更清楚..
@janneb我已经在互斥锁中编写了信号处理程序实现,以实现更好的同步。
@janneb 我没有在文档中找到指定 API backtrace_symbols/backtrace 是否为 async_signal_safe。以及它们是否应该在信号处理程序中使用。
我仍然从我的信号处理程序中删除了 backtrace_symbols 并且不在任何地方使用它..但是我在 backtrace() 中崩溃的实际问题仍然存在。也不知道为什么它会崩溃..
编辑 23/06/11:更多细节:
执行 realloc 时发生崩溃,其中一个地址类似于 0x00000000000007e0(看起来无效)..
linux - 获取其他线程的回溯
在 Linux 中,要获得回溯,您可以使用 backtrace() 库调用,但它只返回当前线程的回溯。假设我知道它是 TID(或 pthread_t)并且我可以保证它处于睡眠状态,是否有任何方法可以获取其他线程的回溯?
似乎 libunwind (http://www.nongnu.org/libunwind/) 项目可以提供帮助。问题是 CentOS 不支持它,所以我不想使用它。
还有其他想法吗?谢谢。
gcc - GDB:关于回溯中文件的相对路径和绝对路径的问题
我对 gdb 或 gcc(但不是 firefox)有疑问。
调试 Firefox 时,我只看到 gdb 中的绝对路径。例子:
阅读这样的回溯是不舒服的。如果我尝试编译和调试微型测试程序,我会看到这样的回溯(带有文件的相对路径):
调试 Firefox 时,如何仅在回溯中看到相对路径?
PS gcc 4.4.1;gdb 7.0。
objective-c - GDB 回溯不显示 Mac 上的函数名称
我用这段代码用 gdb 测试了一些东西(这是一个错误的代码,我只是为了测试目的而使用它):
然后我编译它:gcc -Wall -g -framework Foundation testGdb.m -o testGdb
,然后运行它:
(gdb)
奇怪的是(#1)中没有名字,正确的输出通常会打印NSLog(崩溃的原因)和main。
感谢您帮助理解这种奇怪的行为。
java - 从 Java 中的 Arraylist 中引用父 Arraylist
所以我想知道是否可以在 Java 中追溯一个数组列表?意思是,如果我有类似的东西:
其中'aMainSection'和'aChildSection'都是类型部分的数组列表,我可以从'aChildSection'追溯以获取存储在其父部分'aMainSection'中的值吗?或者我是否必须在部分类中创建某种方法来执行此操作?感谢您提供的任何帮助。
php - 如何使用回溯跟踪失败的文件包含?
要求对此提出体面的想法:
我想在 PHP 代码中实现一些机制,该机制可以运行任何外部代码并在其中一个包含失败时调用回调函数(include
, require
+ *_once
)。
外部代码意味着正在执行的代码不是我编写的,也无法控制它。它包含在测试中。因此,深入了解包含失败的详细信息是有帮助的。
我遇到了一个问题,当发生 PHP 致命错误时,似乎不可能有回调。
到目前为止我尝试了什么:
- 通过注册错误处理程序
set_error_handler
- 不适用于致命错误。 - 使用方法创建了一个对象实例
__destruct()
- 不会因致命错误而被调用。 - 注册了一个关闭函数 - 不调用致命错误。
在其中任何一个中,我只想获取一个debug_backtrace
然后使用给定的信息。
所以很快的问题是:如何从 PHP 代码中跟踪失败的文件包含然后调用一个函数。
从我最近的尝试和搜索中,我担心这个问题的答案是否定的,所以任何有见地的东西都会受到高度赞赏。即使您的回答只会加强“不可能”这一点。
此外,如果可以找出要包含哪个文件也很有帮助,因此至少可以在包含(失败与否)之前创建一个调试输出。
评论:
- 首选无扩展。但是,如果存在某些东西,我也很想知道。
- 外部代码意味着正在执行的代码不是我编写的,也无法控制它。它包含在测试中。因此,深入了解包含失败的详细信息是有帮助的。
有关的:
- 如何让 PHP 在错误时产生回溯?
- set_error_handler() 不适用于致命错误(
register_shutdown_function
+error_get_last
)
java - 创建引用父数组列表的方法
所以我问了一个与此类似的问题,但我不认为我得到的答案与我试图做的事情有关。
说我有这门课:
Java 代码
并且在驱动程序类中以这种方式初始化的子部分......
本质上,有人可以告诉我如何在节类中添加一个方法,该方法从“aChildSection”的数组列表中返回父级吗?
linux - 在调用堆栈上使用 malloc/free 的 Signal Handler 在 Linux 64 位上回溯
下面是我想在运行“Red Hat Enterprise Linux 5.5 (Tikanga) Kernel 2.6.18-194.el5xen x86_64”操作系统的机器上使用的源代码示例。
一般的想法是我想要回溯某个线程,所以我为那个线程发出一个 SIGUSR1 信号,并且一个处理程序执行一个 backtrace() 调用。
在我下面的场景中,FrameTwo 函数循环调用 malloc 和 free。每当为这个特定线程引发信号并且 free 或 malloc 在调用堆栈上时,当信号处理程序调用 backtrace() 时,程序就会崩溃。
我从其他来源了解到不应从信号处理程序调用回溯,因此我为此编写了自己的函数 grok_and_print_thread_stack()。
它使用 RBP 寄存器来导航堆栈(RBP 包含当前帧的基指针指向前一帧的基指针),但是这种算法在这种情况下也不起作用:当 _int_free() 在调用堆栈上时,RBP寄存器导航算法中断,因为 _int_free 的 RBP 是某个值,例如 0x20,它不是有效帧的基指针。
有谁知道如何从寄存器中导航调用堆栈?或者我怎样才能将回溯用于我的目的?