标签: backtrace

GDB 回溯不显示函数名称

我在 SunOS 5.10 上编译了我的库(特别是protbuf-2.3.0) 。-g -O0

make 日志中的示例行如下:

/bin/bash ../libtool --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I. -I..    -D_REENTRANT -pthreads -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare  -g -O0 -MT text_format.lo -MD -MP -MF .deps/text_format.Tpo -c -o text_format.lo `test -f 'google/protobuf/text_format.cc' || echo './'`google/protobuf/text_format.cc
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I.. -D_REENTRANT -pthreads -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare -g -O0 -MT text_format.lo -MD -MP -MF .deps/text_format.Tpo -c google/protobuf/text_format.cc  -fPIC -DPIC -o .libs/text_format.o
Run Code Online (Sandbox Code Playgroud)

然后,我使用以下步骤附加了我的 gdb:

  1. 运行我的应用程序(在本例中,我的 Web 服务器启动一个 Java Web 应用程序,该应用程序在启动期间通过 jni 使用库)。
  2. gdb -p …

gdb function names backtrace

5
推荐指数
1
解决办法
8195
查看次数

GDB 无法显示堆栈并显示“#1 0x0000000000000000 in ?? ()”

我有一个多线程 C++ 程序,在极少数情况下会死锁。这个问题很难重现,我只能在远程机器上重现它。我想用来解决这个问题的方法是

  1. 运行程序
  2. 等待僵局
  3. 向它发送中止信号以生成核心转储
  4. 将转储复制回我的本地机器
  5. 使用 gdb 进行调试

我在远程机器上没有 gdb,无法在其上安装任何东西。问题是当我调试核心转储(从远程机器上的死锁或正常运行的进程获得)时,大多数线程的回溯仅显示:

(gdb) bt
#0 pthread_cond_wait () 在 ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:261
#1 0x0000000000000000 在 ?? ()

我正在使用使用“-g -O1”选项编译的静态链接二进制文件。当我在本地机器上中止相同二进制文件的进程时,gdb 可以从核心转储中提取整个堆栈并且没有这样的问题(但是我无法重现死锁)。我的远程机器是 SLES,我的本地机器是 ubuntu。

任何的想法?

编辑:

发现其他人有同样的问题,但仍然没有解决方案:http : //groups.google.com/group/google-coredumper/browse_thread/thread/2ca9bcf9465d1050 (我没有使用 google coredumper,但似乎 google coredumper 失败了有同样的错误,这表明问题可能出在 SLES 11)

c++ linux gdb dump backtrace

5
推荐指数
1
解决办法
3335
查看次数

共享库中的回溯函数

SEGSEGV进入共享库后,我试图获取堆栈跟踪并将其保存到文件中。共享库是闭源产品的插件。所有这些都适用于生产,但我无法直接访问它。

我的代码捕获SIGSEGV信号,打印堆栈跟踪并退出。我有这样的事情:

/opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019fee] /opt/ecelerity/ libexec/site/ec_attachextensions.so [0x2aecc201a587]

/opt/ecelerity/sbin/ecelerity [0x501235]

/opt/ecelerity/sbin/ecelerity(sieve_seng_execute+0x82) [0x506d32] /opt/ecelerity/libexec/validate/sieve.so [0x2aecc2862c9e] /opt/ecelerity/sbin/ecelerity(validate_data+0xa5) [0x4a90d5] /opt/ ecelerity/sbin/ecelerity(esmtp_message_factory+0x154e) [0x46eace] /opt/ecelerity/sbin/ecelerity(schedule_event_and_dispatch+0x6a) [0x49c59a]

问题是我无法获得共享库的函数名称和其中的偏移量。据我了解,我可以在 addr2line 实用程序的帮助下找到给定地址的函数名称/文件名,然后在/proc/$PID/maps.

之后我正在执行类似的事情:

addr2line -e /opt/ecelerity/libexec/site/ec_attachextensions.so (LIBRARY_OFFSET_FROM_MAPS_FILE - 0x2aecc2019f11)
Run Code Online (Sandbox Code Playgroud)

0x2aecc2019f11上面堆栈跟踪的地址在哪里。我想知道有什么方法可以在不接触地图文件的情况下在堆栈跟踪中获取函数名称?换句话说,我该如何编程呢?在这里会有dladdr帮助吗(在我的例子中dladdr无法从函数提供的地址获取函数名称backtrace)?

c++ linux x86-64 stack-trace backtrace

5
推荐指数
1
解决办法
5945
查看次数

在 iOS 6 中从 backtrace_symbols() 获取符号化堆栈跟踪

在 iOS 6 之前,调用 callStackSymbols() (也是 -[NSException callStackSymbols] 使用的)将提供人类可读的堆栈帧。然而,在 iOS 6 中,情况不再如此,只为 Apple 库提供地址(例如 57 CoreFoundation 0x367ba5db + 118)。

在 iOS 6 中如何以编程方式获取完全符号化的回溯?

symbols crash-reports backtrace human-readable ios6

5
推荐指数
0
解决办法
493
查看次数

SymFromAddr 返回 ERROR_INVALID_ADDRESS 标志,如何在 mingw 中获取堆栈跟踪?

我试图做的就是打印调用给定行的方法堆栈。我从/sf/answers/398963841/答案中得到了代码。稍微重构它以显示问题所在。

#include <windows.h>
#include <iostream>
#include <imagehlp.h>
#include <dbghelp.h>

void printStack( void ) {
  HMODULE dbghelp_lib = LoadLibrary("dbghelp.dll");
  if (NULL == dbghelp_lib) {
    printf("dbghelp.dll failed");
  }
  HANDLE process = GetCurrentProcess();
  if (!SymInitialize( process, NULL, TRUE )) {
    printf("SymInitialize failed: %d\n", GetLastError());
    abort();
  } else SetLastError(0);
  void * stack[100];
  ULONG FramesToSkip = 0;
  ULONG FramesToCapture = 32;
  unsigned short frames = CaptureStackBackTrace( FramesToSkip, FramesToCapture, stack, NULL );
  SYMBOL_INFO * symbol;
  symbol = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) …
Run Code Online (Sandbox Code Playgroud)

c c++ debugging winapi backtrace

5
推荐指数
1
解决办法
2370
查看次数

GNU 汇编器中的本地标签;gdb 打印回溯,就像标签是函数一样

两段示例代码;首先是一些调用程序集的 C++ 代码:

/* test1.cc */
#include <stdio.h>

extern "C" void blah();
extern "C" void stuff() {
  printf( "This is a test\n" );
}

int main( int argc, char *argv[] ) {
  blah();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

...然后大会:

.file "test2.s"
.text
.globl blah, stuff
.type blah,@function
.type stuff,@function
.align 16

blah:
  /* normal function preamble */
  pushl %ebp
  movl %esp, %ebp

label1:
  call stuff

  leave
  retn
Run Code Online (Sandbox Code Playgroud)

内置:

as -g --32 test2.s -o test2.o
clang++ -m32 -g test1.cc -c
clang++ -m32 -g …
Run Code Online (Sandbox Code Playgroud)

assembly gdb gnu-assembler backtrace debug-symbols

5
推荐指数
1
解决办法
1854
查看次数

Javascript 中是否有 Function.caller 的生产安全版本?

有没有办法返回调用当前函数的函数?Function.caller仅适用于非严格模式应用程序。

我希望能够在生产环境中使用此功能,因此我需要打开严格模式。

预期返回:函数本身或函数名称。

function a() {
 b()
}

function b() {
 console.log(b.caller)
}
Run Code Online (Sandbox Code Playgroud)

Function.caller在严格模式下使用时会抛出错误:

未捕获的 TypeError: 'caller'、'callee' 和 'arguments' 属性可能无法在严格模式函数或调用它们的参数对象上访问

javascript strict backtrace

5
推荐指数
1
解决办法
682
查看次数

UIResponder doesNotRecognizeSelector

我在以下回溯中遇到了很多崩溃,但我找不到原因。

根据 Apple -[NSObject(NSObject)doesNotRecognizeSelector:]当一个新对象被分配到先前被释放的对象占用的内存中时发生。

注意:向先前释放的对象发送消息可能会引发 NSInvalidArgumentException 而不是由于内存访问冲突而导致程序崩溃。当在先前被释放的对象占用的内存中分配新对象时,就会发生这种情况。如果您的应用程序由于未捕获的 NSInvalidArgumentException(在异常回溯中查找 -[NSObject(NSObject) doesNotRecognizeSelector:])而崩溃,请考虑使用 Zombies 工具分析您的应用程序以消除不正确的内存管理是原因的可能性。

https://developer.apple.com/library/archive/technotes/tn2151/_index.html

但是回溯的其余部分是怎么回事,尤其是-[UIUndoGestureInteraction didMoveToView:]事情?

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x1ae45498c __exceptionPreprocess + 220 (NSException.m:199)
1   libobjc.A.dylib                 0x1ae17d0a4 objc_exception_throw + 56 (objc-exception.mm:565)
2   CoreFoundation                  0x1ae35843c -[NSObject(NSObject) doesNotRecognizeSelector:] + 140 (NSObject.m:144)
3   UIKitCore                       0x1b24902a8 -[UIResponder doesNotRecognizeSelector:] + 296 (UIResponder.m:659)
4   CoreFoundation                  0x1ae458e08 ___forwarding___ + 1324 (NSForwarding.m:3325)
5   CoreFoundation                  0x1ae45abec _CF_forwarding_prep_0 …
Run Code Online (Sandbox Code Playgroud)

crash backtrace ios swift

5
推荐指数
1
解决办法
1625
查看次数

Windows 上的 Rust 回溯?

我正在尝试在 Windows 上运行我的项目https://github.com/comit-network/create-comit-app/(主分支)(我通常在 unix 系统上编码)。

它恐慌但我无法获得回溯,尽管设置RUST_BACKTRACE=1或什至RUST_BACKTRACE=full.

我在同一台机器上编译和运行。

这是我得到的:

C:/Users/dante/.cargo/bin/cargo.exe run --color=always --package create-comit-app --bin create-comit-app --no-default-features -- start-env
   Compiling create-comit-app v0.5.0 (C:\Users\dante\src\create-comit-app)
    Finished dev [unoptimized + debuginfo] target(s) in 25.36s
     Running `target\debug\create-comit-app.exe start-env`
Panic received, cleaning up...Panic received, cleaning up...thread panicked while processing panic. aborting.
error: process didn't exit successfully: `target\debug\create-comit-app.exe start-env` (exit code: 0xc000001d, STATUS_ILLEGAL_INSTRUCTION)

Process finished with exit code -1073741795 (0xC000001D)
Run Code Online (Sandbox Code Playgroud)

经过一些研究,似乎应该可以在 Windows 上获得 BACKTRACE?

我在同一台机器上编码和运行:

Rust: 1.39.0
>rustc --version
rustc 1.39.0 …
Run Code Online (Sandbox Code Playgroud)

windows backtrace rust

5
推荐指数
4
解决办法
2465
查看次数

是否可以在Rust中打印回溯而不必惊慌?

是否可以打印回溯记录(假设已启用RUST_BACKTRACE)而不会出现恐慌?似乎唯一的方法是通过调用panic!。如果没有,那是有原因的吗?

backtrace rust

4
推荐指数
2
解决办法
261
查看次数