@@ -633,22 +633,25 @@ JL_DLLEXPORT jl_value_t *jl_lookup_code_address(void *ip, int skipC)
633633    return  rs ;
634634}
635635
636- static  void  jl_safe_print_codeloc (const  char *  func_name , const  char *  file_name ,
636+ static  void  jl_safe_print_codeloc (const  char  * pre_str ,
637+                                   const  char *  func_name , const  char *  file_name ,
637638                                  int  line , int  inlined ) JL_NOTSAFEPOINT 
638639{
639640    const  char  * inlined_str  =  inlined  ? " [inlined]"  : "" ;
640641    if  (line  !=  -1 ) {
641-         jl_safe_printf ("%s at %s:%d%s\n" , func_name , file_name , line , inlined_str );
642+         jl_safe_printf ("%s%s at %s:%d%s\n" ,
643+                        pre_str , func_name , file_name , line , inlined_str );
642644    }
643645    else  {
644-         jl_safe_printf ("%s at %s (unknown line)%s\n" , func_name , file_name , inlined_str );
646+         jl_safe_printf ("%s%s at %s (unknown line)%s\n" ,
647+                        pre_str , func_name , file_name , inlined_str );
645648    }
646649}
647650
648651// Print function, file and line containing native instruction pointer `ip` by 
649652// looking up debug info. Prints multiple such frames when `ip` points to 
650653// inlined code. 
651- void  jl_print_native_codeloc (uintptr_t  ip ) JL_NOTSAFEPOINT 
654+ void  jl_print_native_codeloc (char   * pre_str ,  uintptr_t  ip ) JL_NOTSAFEPOINT 
652655{
653656    // This function is not allowed to reference any TLS variables since 
654657    // it can be called from an unmanaged thread on OSX. 
@@ -660,10 +663,11 @@ void jl_print_native_codeloc(uintptr_t ip) JL_NOTSAFEPOINT
660663    for  (i  =  0 ; i  <  n ; i ++ ) {
661664        jl_frame_t  frame  =  frames [i ];
662665        if  (!frame .func_name ) {
663-             jl_safe_printf ("unknown  function (ip: %p) at %s\n" , (void * )ip , frame .file_name  ? frame .file_name  : "(unknown file)" );
666+             jl_safe_printf ("%sunknown  function (ip: %p) at %s\n" ,  pre_str , (void * )ip , frame .file_name  ? frame .file_name  : "(unknown file)" );
664667        }
665668        else  {
666-             jl_safe_print_codeloc (frame .func_name , frame .file_name , frame .line , frame .inlined );
669+             jl_safe_print_codeloc (pre_str , frame .func_name ,
670+                                   frame .file_name , frame .line , frame .inlined );
667671            free (frame .func_name );
668672        }
669673        free (frame .file_name );
@@ -721,7 +725,7 @@ const char *jl_debuginfo_name(jl_value_t *func)
721725
722726// func == module : top-level 
723727// func == NULL : macro expansion 
724- static  void  jl_print_debugloc (jl_debuginfo_t  * debuginfo , jl_value_t  * func , size_t  ip , int  inlined ) JL_NOTSAFEPOINT 
728+ static  void  jl_print_debugloc (const   char   * pre_str ,  jl_debuginfo_t  * debuginfo , jl_value_t  * func , size_t  ip , int  inlined ) JL_NOTSAFEPOINT 
725729{
726730    if  (!jl_is_symbol (debuginfo -> def )) // this is a path or 
727731        func  =  debuginfo -> def ; // this is inlined code 
@@ -730,26 +734,33 @@ static void jl_print_debugloc(jl_debuginfo_t *debuginfo, jl_value_t *func, size_
730734    if  (edges_idx ) {
731735        jl_debuginfo_t  * edge  =  (jl_debuginfo_t * )jl_svecref (debuginfo -> edges , edges_idx  -  1 );
732736        assert (jl_typetagis (edge , jl_debuginfo_type ));
733-         jl_print_debugloc (edge , NULL , stmt .pc , 1 );
737+         jl_print_debugloc (pre_str ,  edge , NULL , stmt .pc , 1 );
734738    }
735739    intptr_t  ip2  =  stmt .line ;
736740    if  (ip2  >= 0  &&  ip  >  0  &&  (jl_value_t * )debuginfo -> linetable  !=  jl_nothing ) {
737-         jl_print_debugloc (debuginfo -> linetable , func , ip2 , 0 );
741+         jl_print_debugloc (pre_str ,  debuginfo -> linetable , func , ip2 , 0 );
738742    }
739743    else  {
740744        if  (ip2  <  0 ) // set broken debug info to ignored 
741745            ip2  =  0 ;
742746        const  char  * func_name  =  jl_debuginfo_name (func );
743747        const  char  * file  =  jl_debuginfo_file (debuginfo );
744-         jl_safe_print_codeloc (func_name , file , ip2 , inlined );
748+         jl_safe_print_codeloc (pre_str ,  func_name , file , ip2 , inlined );
745749    }
746750}
747751
748752// Print code location for backtrace buffer entry at *bt_entry 
749- void  jl_print_bt_entry_codeloc (jl_bt_element_t  * bt_entry ) JL_NOTSAFEPOINT 
753+ void  jl_print_bt_entry_codeloc (int   sig ,  jl_bt_element_t  * bt_entry ) JL_NOTSAFEPOINT 
750754{
755+     char  sig_str [32 ], pre_str [64 ];
756+     sig_str [0 ] =  '\0' ;
757+     if  (sig  !=  -1 ) {
758+         snprintf (sig_str , 32 , "signal (%d) " , sig );
759+     }
760+     snprintf (pre_str , 64 , "%sthread (%d) " , sig_str , jl_threadid () +  1 );
761+ 
751762    if  (jl_bt_is_native (bt_entry )) {
752-         jl_print_native_codeloc (bt_entry [0 ].uintptr );
763+         jl_print_native_codeloc (pre_str ,  bt_entry [0 ].uintptr );
753764    }
754765    else  if  (jl_bt_entry_tag (bt_entry ) ==  JL_BT_INTERP_FRAME_TAG ) {
755766        size_t  ip  =  jl_bt_entry_header (bt_entry ); // zero-indexed 
@@ -768,7 +779,7 @@ void jl_print_bt_entry_codeloc(jl_bt_element_t *bt_entry) JL_NOTSAFEPOINT
768779        if  (jl_is_code_info (code )) {
769780            jl_code_info_t  * src  =  (jl_code_info_t * )code ;
770781            // See also the debug info handling in codegen.cpp. 
771-             jl_print_debugloc (src -> debuginfo , def , ip  +  1 , 0 );
782+             jl_print_debugloc (pre_str ,  src -> debuginfo , def , ip  +  1 , 0 );
772783        }
773784        else  {
774785            // If we're using this function something bad has already happened; 
@@ -1357,7 +1368,9 @@ JL_DLLEXPORT jl_record_backtrace_result_t jl_record_backtrace(jl_task_t *t, jl_b
13571368
13581369JL_DLLEXPORT  void  jl_gdblookup (void *  ip )
13591370{
1360-     jl_print_native_codeloc ((uintptr_t )ip );
1371+     char  pre_str [64 ];
1372+     snprintf (pre_str , 64 , "thread (%d) " , jl_threadid () +  1 );
1373+     jl_print_native_codeloc (pre_str , (uintptr_t )ip );
13611374}
13621375
13631376// Print backtrace for current exception in catch block 
@@ -1372,7 +1385,7 @@ JL_DLLEXPORT void jlbacktrace(void) JL_NOTSAFEPOINT
13721385    size_t  i , bt_size  =  jl_excstack_bt_size (s , s -> top );
13731386    jl_bt_element_t  * bt_data  =  jl_excstack_bt_data (s , s -> top );
13741387    for  (i  =  0 ; i  <  bt_size ; i  +=  jl_bt_entry_size (bt_data  +  i )) {
1375-         jl_print_bt_entry_codeloc (bt_data  +  i );
1388+         jl_print_bt_entry_codeloc (-1 ,  bt_data  +  i );
13761389    }
13771390}
13781391
@@ -1387,7 +1400,7 @@ JL_DLLEXPORT void jlbacktracet(jl_task_t *t) JL_NOTSAFEPOINT
13871400    size_t  bt_size  =  r .bt_size ;
13881401    size_t  i ;
13891402    for  (i  =  0 ; i  <  bt_size ; i  +=  jl_bt_entry_size (bt_data  +  i )) {
1390-         jl_print_bt_entry_codeloc (bt_data  +  i );
1403+         jl_print_bt_entry_codeloc (-1 ,  bt_data  +  i );
13911404    }
13921405    if  (bt_size  ==  0 )
13931406        jl_safe_printf ("      no backtrace recorded\n" );
0 commit comments