@@ -35,6 +35,10 @@ namespace bthread {
3535
3636DEFINE_uint32 (signal_trace_timeout_ms, 50 , " Timeout for signal trace in ms" );
3737BUTIL_VALIDATE_GFLAG (signal_trace_timeout_ms, butil::PositiveInteger<uint32_t >);
38+ // Note that SIGURG handler may be registered by some library such as cgo
39+ // so let the signal number be configurable
40+ DEFINE_int32 (signal_number_for_trace, SIGURG,
41+ " signal number used for stack trace, default to SIGURG" );
3842
3943extern BAIDU_THREAD_LOCAL TaskMeta* pthread_fake_meta;
4044
@@ -315,17 +319,19 @@ TaskTracer::Result TaskTracer::TraceByLibunwind(unw_cursor_t& cursor) {
315319
316320bool TaskTracer::RegisterSignalHandler () {
317321 // Set up the signal handler.
322+ _signal_num = FLAGS_signal_number_for_trace;
318323 struct sigaction old_sa{};
319324 struct sigaction sa{};
320325 sa.sa_sigaction = SignalHandler;
321326 sa.sa_flags = SA_SIGINFO;
322327 sigfillset (&sa.sa_mask );
323- if (sigaction (SIGURG , &sa, &old_sa) != 0 ) {
328+ if (sigaction (_signal_num , &sa, &old_sa) != 0 ) {
324329 PLOG (ERROR) << " Failed to sigaction" ;
325330 return false ;
326331 }
327332 if (NULL != old_sa.sa_handler || NULL != old_sa.sa_sigaction ) {
328- LOG (ERROR) << " Signal handler of SIGURG is already registered" ;
333+ LOG (ERROR) << " Signal handler of signal number "
334+ << _signal_num << " is already registered" ;
329335 return false ;
330336 }
331337
@@ -403,7 +409,7 @@ TaskTracer::Result TaskTracer::SignalTrace(pthread_t worker_tid) {
403409 sigval value{};
404410 value.sival_ptr = signal_sync.get ();
405411 size_t sigqueue_try = 0 ;
406- while (pthread_sigqueue (worker_tid, SIGURG , value) != 0 ) {
412+ while (pthread_sigqueue (worker_tid, _signal_num , value) != 0 ) {
407413 if (errno != EAGAIN || sigqueue_try++ >= 3 ) {
408414 // Remove reference for SignalHandler.
409415 signal_sync->RemoveRefManually ();
0 commit comments