linux 程序崩溃signal,是什么导致Linux 64位上的backtrace()崩溃(SIGSEGV)

开发者在Linux环境下尝试通过自定义的SIGUSR1信号处理程序来周期性地获取所有线程的回溯信息,但在调用backtrace()时遇到SIGSEGV错误。通过对问题的详细描述及调试信息分析,寻求可能导致崩溃的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在linux上开发一个应用程序,我想要以特定频率回溯所有正在运行的线程。所以我的用户定义的信号处理程序SIGUSR1(针对所有线程)调用backtrace()。

我在我的信号处理程序中发生崩溃(SIGSEGV),它是由backtrace()调用产生的。我已将正确的参数传递给大多数网站上指定的函数。

http://linux.die.net/man/3/backtrace。

在这种情况下会导致backtrace()崩溃?

添加更多细节:

下面的框架14是什么让我得出这样的结论,即崩溃是在回溯内部的。 onMySignal是信号处理程序SIGUSR1,它调用回溯。

onMySignal的示例代码是(从linux的backtrace文档复制的)

pthread_mutex_lock( &sig_mutex );

int j, nptrs;

#define SIZE 100

void *buffer[100] = {NULL};//or void *buffer[100];

char **strings;

nptrs = backtrace(buffer, SIZE);

pthread_mutex_unlock( &sig_mutex );

(gdb) where

#0 0x00000037bac0e9dd in raise () from

#1 0x00002aaabda936b2 in skgesigOSCrash () from

#2 0x00002aaabdd31705 in kpeDbgSignalHandler ()

#3 0x00002aaabda938c2 in skgesig_sigactionHandler ()

#4

#5 0x00000037ba030265 in raise () from

#6 0x00000037ba031d10 in abort () from

#7 0x00002b6cef82efd7 in os::abort(bool) () from

#8 0x00002b6cef98205d in VMError::report_and_die() ()

#9 0x00002b6cef835655 in JVM_handle_linux_signal ()

#10 0x00002b6cef831bae in signalHandler(int, siginfo*, void*) ()

#11

#12 0x00000037be407638 in ?? ()

#13 0x00000037be4088bb in _Unwind_Backtrace ()

#14 0x00000037ba0e5fa8 in backtrace ()

#15 0x00002aaaaae3875f in onMySignal (signum=10,info=0x4088ec80, context=0x4088eb50)

#16

#17 0x00002aaab4aa8acb in mxSession::setPartition(int)

#18 0x0000000000000001 in ?? ()

#19 0x0000000000000000 in ?? ()

(gdb)希望这会使问题更加明确。

@janneb

我已经在互斥锁中写入了信号处理程序实现以实现更好的同步。

@janneb

我没有在Document中找到指定API backtrace_symbols / backtrace是不是async_signal_safe。以及它们是否应该在信号处理程序中使用。

仍然我从我的信号处理程序中删除了backtrace_symbols,并且不使用它在任何地方......但我的实际问题是在backtrace()persit中崩溃。并不知道为什么它会崩溃..

编辑23/06/11:更多细节: h2>

(gdb) where

#0 0x00000037bac0e9dd in raise () from

#1 0x00002aaab98a36b2 in skgesigOSCrash () from

#2 0x00002aaab9b41705 in kpeDbgSignalHandler () from

#3 0x00002aaab98a38c2 in skgesig_sigactionHandler () from

#4

#5 0x00000037ba030265 in raise () from

#6 0x00000037ba031d10 in abort () from

#7 0x00002ac003803fd7 in os::abort(bool) () from

#8 0x00002ac00395705d in VMError::report_and_die() () from

#9 0x00002ac00380a655 in JVM_handle_linux_signal () from

#10 0x00002ac003806bae in signalHandler(int, siginfo*, void*) () from

#11

#12 0x00000037be407638 in ?? () from libgcc_s.so.1

#13 0x00000037be4088bb in _Unwind_Backtrace () from libgcc_s.so.1

#14 0x00000037ba0e5fa8 in backtrace () from libc.so.6

#15 0x00002aaaaae3875f in onMyBacktrace (signum=10, info=0x415d0eb0, context=0x415d0d80)

#16

#17 0x00000037ba071fa8 in _int_free () from libc.so.6

#18 0x00000000000007e0 in ?? ()

#19 0x000000005aab01a0 in ?? ()

#20 0x000000000000006f in ?? ()

#21 0x00000037ba075292 in realloc () from libc.so.6

#22 0x00002aaab6248c4e in Memory::reallocMemory(void*, unsigned long, char const*, int) ()当realloc正在执行时发生崩溃,并且其中一个地址类似于0x00000000000007e0(看起来无效)..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值