我在 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:
gdb -p …我有一个多线程 C++ 程序,在极少数情况下会死锁。这个问题很难重现,我只能在远程机器上重现它。我想用来解决这个问题的方法是
我在远程机器上没有 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)
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)?
在 iOS 6 之前,调用 callStackSymbols() (也是 -[NSException callStackSymbols] 使用的)将提供人类可读的堆栈帧。然而,在 iOS 6 中,情况不再如此,只为 Apple 库提供地址(例如 57 CoreFoundation 0x367ba5db + 118)。
在 iOS 6 中如何以编程方式获取完全符号化的回溯?
我试图做的就是打印调用给定行的方法堆栈。我从/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++ 代码:
/* 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) 有没有办法返回调用当前函数的函数?Function.caller仅适用于非严格模式应用程序。
我希望能够在生产环境中使用此功能,因此我需要打开严格模式。
预期返回:函数本身或函数名称。
function a() {
b()
}
function b() {
console.log(b.caller)
}
Run Code Online (Sandbox Code Playgroud)
Function.caller在严格模式下使用时会抛出错误:
未捕获的 TypeError: 'caller'、'callee' 和 'arguments' 属性可能无法在严格模式函数或调用它们的参数对象上访问
我在以下回溯中遇到了很多崩溃,但我找不到原因。
根据 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) 我正在尝试在 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) 是否可以打印回溯记录(假设已启用RUST_BACKTRACE)而不会出现恐慌?似乎唯一的方法是通过调用panic!。如果没有,那是有原因的吗?