@@ -65,32 +65,58 @@ libspl_backtrace(int fd)
65
65
ssize_t ret __attribute__((unused ));
66
66
unw_context_t uc ;
67
67
unw_cursor_t cp ;
68
- unw_word_t loc ;
68
+ unw_word_t v ;
69
69
char buf [128 ];
70
- size_t n ;
70
+ size_t n , c ;
71
71
72
- ret = write (fd , "Call trace:\n" , 12 );
73
72
unw_getcontext (& uc );
73
+
74
74
unw_init_local (& cp , & uc );
75
+ ret = write (fd , "Registers:\n" , 11 );
76
+ c = 0 ;
77
+ for (uint_t regnum = 0 ; regnum <= UNW_TDEP_LAST_REG ; regnum ++ ) {
78
+ if (unw_get_reg (& cp , regnum , & v ) < 0 )
79
+ continue ;
80
+ const char * name = unw_regname (regnum );
81
+ for (n = 0 ; name [n ] != '\0' && name [n ] != '?' ; n ++ ) {}
82
+ if (n == 0 ) {
83
+ buf [0 ] = '?' ;
84
+ n = libspl_u64_to_hex_str (regnum , 2 ,
85
+ & buf [1 ], sizeof (buf )- 1 ) + 1 ;
86
+ name = buf ;
87
+ }
88
+ ret = write (fd , " " , 5 - MIN (n , 3 ));
89
+ ret = write (fd , name , n );
90
+ ret = write (fd , ": 0x" , 4 );
91
+ n = libspl_u64_to_hex_str (v , 18 , buf , sizeof (buf ));
92
+ ret = write (fd , buf , n );
93
+ if (!(++ c % 3 ))
94
+ ret = write (fd , "\n" , 1 );
95
+ }
96
+ if (c % 3 )
97
+ ret = write (fd , "\n" , 1 );
98
+
99
+ unw_init_local (& cp , & uc );
100
+ ret = write (fd , "Call trace:\n" , 12 );
75
101
while (unw_step (& cp ) > 0 ) {
76
- unw_get_reg (& cp , UNW_REG_IP , & loc );
102
+ unw_get_reg (& cp , UNW_REG_IP , & v );
77
103
ret = write (fd , " [0x" , 5 );
78
- n = libspl_u64_to_hex_str (loc , 10 , buf , sizeof (buf ));
104
+ n = libspl_u64_to_hex_str (v , 18 , buf , sizeof (buf ));
79
105
ret = write (fd , buf , n );
80
106
ret = write (fd , "] " , 2 );
81
- unw_get_proc_name (& cp , buf , sizeof (buf ), & loc );
107
+ unw_get_proc_name (& cp , buf , sizeof (buf ), & v );
82
108
for (n = 0 ; n < sizeof (buf ) && buf [n ] != '\0' ; n ++ ) {}
83
109
ret = write (fd , buf , n );
84
110
ret = write (fd , "+0x" , 3 );
85
- n = libspl_u64_to_hex_str (loc , 2 , buf , sizeof (buf ));
111
+ n = libspl_u64_to_hex_str (v , 2 , buf , sizeof (buf ));
86
112
ret = write (fd , buf , n );
87
113
#ifdef HAVE_LIBUNWIND_ELF
88
114
ret = write (fd , " (in " , 5 );
89
- unw_get_elf_filename (& cp , buf , sizeof (buf ), & loc );
115
+ unw_get_elf_filename (& cp , buf , sizeof (buf ), & v );
90
116
for (n = 0 ; n < sizeof (buf ) && buf [n ] != '\0' ; n ++ ) {}
91
117
ret = write (fd , buf , n );
92
118
ret = write (fd , " +0x" , 4 );
93
- n = libspl_u64_to_hex_str (loc , 2 , buf , sizeof (buf ));
119
+ n = libspl_u64_to_hex_str (v , 2 , buf , sizeof (buf ));
94
120
ret = write (fd , buf , n );
95
121
ret = write (fd , ")" , 1 );
96
122
#endif
0 commit comments