Articles of 堆栈跟踪

你如何以编程方式从父级获取subprocess的堆栈跟踪?

假设我在程序中分支了一个subprocess。 在某个时候,我用kill(child, SIGSTOP)暂停subprocess,并想检查栈的内容。 有没有办法以编程方式从父级获取subprocess的堆栈跟踪? 我知道ptrace是追踪subprocess并检查其内存/寄存器的标准方式。 我也知道backtrace为调用线程提供了这个function。 有没有合并这些function的函数或库? 或者我需要手动走栈与ptrace ?

从信号处理程序打印堆栈跟踪

我需要从在Linux上运行的64位multithreadingC ++应用程序的信号处理程序打印堆栈跟踪。 虽然我find了几个代码示例,但是没有一个编译。 我的阻塞点是从ucontext_t结构中获取调用者(生成信号的点)的地址。 我可以find的所有信息都指向EIP寄存器,如ucontext.gregs [REG_EIP]或ucontext.eip。 看起来他们都是x86特定的。 英特尔和AMD处理器都需要符合64位的代码。 任何人都可以帮忙吗?

如果EBP帧指针为NULL,堆栈是否损坏?

我对堆栈跟踪的理解基本上是基于什么是基本指针和堆栈指针? 他们指的是什么? 。 一个多年来一直在帮助开发的程序在崩溃时吐出了一个堆栈转储,我习惯于评估这些堆栈跟踪,与C ++编译器生成的.map文件相对应。 很多时候,我已经成功地走过堆栈和debugging问题。 但是,有时堆栈跟踪有一个NULL EBP(帧)指针。 这是来自这样一个示例堆栈转储的相关代码片段: Initial EBP pointer value: 04d8fab0 {at address 04d8fab0: 00000000} 正如你所看到的,EBP帧指针的值是NULL。 所以我不能走栈。 这是一个损坏的堆栈的标志,还是有另一种可能的解释?

从未捕获的exception获取堆栈跟踪?

我意识到这将是特定于平台的:有没有办法从未被捕获的C ++exception中获取堆栈跟踪,但是从抛出exception的地步? 我有一个Windows结构化exception处理程序来捕获访问冲突等,并生成一个小型转储。 但是当然由于未被捕获的C ++exception,在终止的情况下不会被调用,所以没有崩溃转储。 我正在寻找一个Windows解决scheme(不pipe多么肮脏!),但如果可能的话,希望听到其他平台。 谢谢。

解决托pipe和本地堆栈跟踪 – 要使用哪个API?

这是我前一个问题的继续 – 第二阶段可以这么说。 第一个问题是: 在Windows / 64位/混合模式下快速捕获堆栈跟踪 现在我已经解决了大量的堆栈跟踪,现在想知道如何解决pipe理堆栈帧的符号信息。 对于本机C ++方面来说,它相对简单 – 首先你要指定从哪里取符号的过程: HANDLE g_hProcess = GetCurrentProcess(); 在这里你可以使用代码snipet在运行时replace进程: g_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_processId); b = (g_hProcess != NULL ); if( !b ) errInfo.AppendFormat(_T("Process id '%08X' is not running anymore."), g_processId ); else InitSymbolLoad(); 并初始化符号加载: void InitSymbolLoad() { SymInitialize(g_hProcess, NULL, TRUE); DWORD dwFlags = SymGetOptions(); SymSetOptions(SymGetOptions() | […]

如何从崩溃中提取debugging信息

如果我的C ++应用程序在Windows上崩溃,我想发送有用的debugging信息到我们的服务器。 在Linux上,我会使用GNU的backtrace()函数 – 是否有相当于Windows? 程序崩溃后,有没有办法提取有用的debugging信息? 还是只从内部过程? (build议“testing你的应用程序,所以它不会崩溃”没有帮助! – 所有不平凡的程序都会有错误)

C ++堆栈跟踪问题

我正在开发一个我想用于在Windows Vista / 7的计算机上logging当前调用堆栈的类。 (非常类似于“漫游呼叫” http://www.codeproject.com/Articles/11132/Walking-the-callstack )。 首先,我使用RtlCaptureContext来获取当前的上下文logging,然后使用StackWalk64来获取各个堆栈帧。 现在,我意识到在STACKFRAME64.AddrPC中的程序计数器实际上会随着特定的代码行而改变,只要我closures程序并重新启动。 出于某种原因,我认为只要不更改源代码并重新编译它,特定代码行的PC地址就会保持不变。 我需要PC-Address使用SymFromAddr和SymGetLineFromAddr64来获取有关被调用函数,代码文件和行号的信息。 不幸的是,只有在程序debugging数据库(PDB-File)时才有效,但我不能将其提供给客户端。 我的计划是logging调用堆栈的PC地址(无论何时需要),然后将其从客户端发送给我。 所以,我可以使用我的PDB文件来找出哪些函数被调用,但当然只有当PC地址是唯一标识符时才起作用。 由于每次启动程序都会改变,所以我不能使用这种方法。 你知道更好的方法来读取调用堆栈或改变程序计数器的问题吗? 我认为一个可能的解决scheme可能是始终获取已知位置的PC地址,并将其用作参考,以仅确定不同PC地址之间的偏移量。 这似乎工作,但我不知道,如果这是一个有效的方法,并将始终工作。 非常感谢您的帮助! 我将在codeproject.com上发布最终(封装)的解决scheme,如果你愿意,我会说你帮助了我。