Skip to content

Commit fc43d91

Browse files
committed
* added csv option for stacktrace, which gives a lot more info, ready to be processed by addr2line or so
1 parent 137ef20 commit fc43d91

File tree

9 files changed

+157
-51
lines changed

9 files changed

+157
-51
lines changed

.mulle/share/env/environment-plugin.sh

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.mulle/share/env/version

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.mulle/share/sde/version/mulle-sde/cmake

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required( VERSION 3.14)
22

3-
project( mulle-stacktrace VERSION 0.2.9 LANGUAGES C)
3+
project( mulle-stacktrace VERSION 0.3.0 LANGUAGES C)
44

55

66
### mulle-sde environment

RELEASENOTES.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 0.3.0
2+
3+
* added csv option for stacktrace, which gives a lot more info, ready to be processed by addr2line or so
4+
5+
16
### 0.2.9
27

38
add some missing files

clib.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name" : "mulle-stacktrace",
3-
"version" : "0.2.9",
3+
"version" : "0.3.0",
44
"description" : "👣 Stracktrace support for various OS",
55
"keywords" : [],
66
"license" : "BSD-3-Clause",

cmake/share/InstallRpath.cmake

Lines changed: 9 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/mulle-stacktrace-execinfo.c

Lines changed: 131 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include <errno.h>
4444
#include <string.h>
4545
#include <stdlib.h>
46+
#include <ctype.h>
4647
#include <execinfo.h>
4748

4849
// clang speciality
@@ -224,12 +225,12 @@ static int _dump_less_shabby( struct mulle_stacktrace *stacktrace,
224225

225226

226227
static void _shabby_default_dump( struct mulle_stacktrace *stacktrace,
227-
void **callstack,
228-
int frames,
229-
int offset,
230-
FILE *fp,
231-
char *delimchar,
232-
enum mulle_stacktrace_format format)
228+
void **callstack,
229+
int frames,
230+
int offset,
231+
FILE *fp,
232+
char *delimchar,
233+
enum mulle_stacktrace_format format)
233234
{
234235
char **strs;
235236
char **p;
@@ -262,6 +263,10 @@ static struct mulle_stacktrace dummy =
262263
};
263264

264265

266+
// csv output:
267+
//
268+
// address,symbol,symbol_offset,segment_name,segment_offset
269+
//
265270
static void mulle_stacktrace_dump( struct mulle_stacktrace *stacktrace,
266271
void **callstack,
267272
int frames,
@@ -272,17 +277,25 @@ static void mulle_stacktrace_dump( struct mulle_stacktrace *stacktrace,
272277
{
273278
char *delim;
274279
char *s;
280+
char *segment_name;
281+
char *symbol_name;
282+
char buf[ 512];
275283
Dl_info info;
276-
ptrdiff_t diff;
277-
size_t max;
278284
int havedl;
285+
int i;
286+
intptr_t segment_offset;
287+
intptr_t symbol_offset;
288+
size_t max;
279289
void **p;
280290
void **sentinel;
281291
void *address;
292+
void *segment_address;
293+
void *symbol_address;
282294
void *userinfo;
283-
// char **strs;
284-
char buf[ 512];
285-
int i;
295+
#if 0
296+
int symbol_name_length;
297+
int segment_name_length;
298+
#endif
286299

287300
// non underscore shouldn't crash for NULL params
288301
if( ! stacktrace || ! callstack || ! fp || ! delimchar)
@@ -300,54 +313,107 @@ static void mulle_stacktrace_dump( struct mulle_stacktrace *stacktrace,
300313
delim = (i == 0) ? "" : delimchar;
301314
++i;
302315

303-
address = *--p;
304-
max = 0x800;
316+
address = *--p;
317+
symbol_address = NULL;
318+
segment_address = NULL;
319+
symbol_offset = 0;
320+
segment_offset = (intptr_t) address;
321+
symbol_name = "";
322+
segment_name = "";
323+
305324
//musl doesn't have it ?
325+
max = 0x800;
306326
havedl = dladdr( address, &info);
307-
if( havedl && info.dli_saddr)
327+
if( havedl)
308328
{
309-
max = (intptr_t) address - (intptr_t) info.dli_saddr;
310-
if( max > 0x800)
311-
max = 0x800;
329+
if( info.dli_saddr)
330+
{
331+
symbol_address = info.dli_saddr;
332+
symbol_offset = (intptr_t) address - (intptr_t) symbol_address;
333+
max = symbol_offset < max ? symbol_offset : max;
334+
}
335+
segment_name = info.dli_fname ? (char *) info.dli_fname : "";
336+
segment_address = info.dli_fbase;
337+
segment_offset = (intptr_t) address - (intptr_t) segment_address;
338+
symbol_name = info.dli_sname ? (char *) info.dli_sname : "";
312339
}
313340

314-
// try to improve on max with symbolizer
341+
// try to improve on max with symbolizer, if we aren't close enough
342+
// complete heuristic
315343
if( max)
316344
{
317345
s = stacktrace->symbolize( address, max - 1, buf, sizeof( buf), &userinfo);
318-
if( s)
346+
if( s && (! symbol_name || strcmp( symbol_name, s)))
319347
{
320-
if( ! stacktrace->is_boring( s, -1))
321-
fprintf( fp, "%s %s", delim, s);
322-
continue;
348+
symbol_name = s;
349+
symbol_offset = 0; // now unknown really
323350
}
324351
}
325352

353+
#if 0
354+
// for some weird reason symbol_name and segment_name have linefeeds
355+
// at the end
356+
symbol_name_length = symbol_name ? strlen( symbol_name) : 0;
357+
while( symbol_name_length)
358+
{
359+
if( isprint( symbol_name[ symbol_name_length - 1]))
360+
break;
361+
symbol_name_length--;
362+
}
363+
364+
segment_name_length = segment_name ? strlen( segment_name) : 0;
365+
while( segment_name_length)
366+
{
367+
if( isprint( segment_name[ segment_name_length - 1]))
368+
break;
369+
segment_name_length--;
370+
}
371+
#endif
372+
373+
// address,segment_offset,symbol_offset,symbol_address,symbol_name,segment_address,segment_name
374+
if( format == mulle_stacktrace_csv)
375+
{
376+
fprintf( fp, "%p,0x%tx,0x%td,",
377+
address,
378+
segment_offset,
379+
symbol_offset);
380+
if( symbol_address)
381+
fprintf( fp, "%p,\"%s\",",
382+
symbol_address,
383+
symbol_name);
384+
else
385+
fprintf( fp, ",\"%s\",", symbol_name);
386+
387+
fprintf( fp, "0x%tx,\"%s\"\n",
388+
(intptr_t) segment_address,
389+
segment_name);
390+
391+
continue;
392+
}
393+
326394
if( havedl)
327395
{
328-
if( info.dli_sname)
396+
if( symbol_name)
329397
{
330-
if( ! stacktrace->is_boring( (char *) info.dli_sname, -1))
331-
{
332-
diff = (intptr_t) address - (intptr_t) info.dli_saddr;
333-
if( diff)
334-
fprintf( fp, "%s %s+0x%0lx", delim, info.dli_sname, (long) diff);
335-
else
336-
fprintf( fp, "%s %s", delim, info.dli_sname);
337-
}
338-
continue;
398+
if( stacktrace->is_boring( (char *) symbol_name, -1))
399+
continue;
400+
401+
if( symbol_offset)
402+
fprintf( fp, "%s %s+0x%0lx", delim, symbol_name, (long) symbol_offset);
403+
else
404+
fprintf( fp, "%s %s", delim, symbol_name);
339405
}
340406

341-
if( info.dli_fname)
407+
if( segment_name)
342408
{
343-
s = strrchr( info.dli_fname, '/');
409+
s = strrchr( segment_name, '/');
344410
if( s)
345411
s = &s[ 1];
346412
else
347-
s = (char *) info.dli_fname;
413+
s = (char *) segment_name;
348414

349415
// relative address of shared lib is not really useful
350-
fprintf( fp, "%s %s:%p", delim, s, address);
416+
fprintf( fp, "%s %s:0x%tx", delim, s, segment_offset);
351417
continue;
352418
}
353419
}
@@ -377,11 +443,28 @@ void _mulle_stacktrace( struct mulle_stacktrace *stacktrace,
377443
if( ! fp)
378444
fp = stderr;
379445

380-
delimchar = "\n";
381-
if( ! (format & mulle_stacktrace_linefeed))
446+
447+
// mulle_stacktrace_normal = 0,
448+
// mulle_stacktrace_trimmed = 1,
449+
// mulle_stacktrace_linefeed = 2,
450+
// mulle_stacktrace_csv = 3
451+
452+
switch( format)
382453
{
454+
case mulle_stacktrace_normal :
455+
case mulle_stacktrace_trimmed :
383456
fprintf( fp, " : [");
384-
delimchar = " |";
457+
delimchar = " |";;
458+
break;
459+
460+
case mulle_stacktrace_linefeed :
461+
delimchar = "\n";
462+
break;
463+
464+
default :
465+
fprintf( fp, "address,segment_offset,symbol_offset,symbol_address,symbol_name,segment_address,segment_name\n");
466+
delimchar = "\n";
467+
break;
385468
}
386469

387470
{
@@ -396,7 +479,15 @@ void _mulle_stacktrace( struct mulle_stacktrace *stacktrace,
396479
#endif
397480
}
398481

399-
fputc( (format & mulle_stacktrace_linefeed) ? '\n' : ']', fp);
482+
switch( format)
483+
{
484+
case mulle_stacktrace_normal : // fall thru
485+
case mulle_stacktrace_trimmed : fputc( ']', fp);
486+
break;
487+
488+
case mulle_stacktrace_linefeed : fputc( '\n', fp); // fall thru
489+
default : break;
490+
}
400491
}
401492

402493

src/mulle-stacktrace.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
*
5151
* version: major, minor, patch
5252
*/
53-
#define MULLE__STACKTRACE_VERSION ((0UL << 20) | (2 << 8) | 9)
53+
#define MULLE__STACKTRACE_VERSION ((0UL << 20) | (3 << 8) | 0)
5454

5555

5656
static inline unsigned int mulle_stacktrace_get_version_major( void)
@@ -109,7 +109,8 @@ enum mulle_stacktrace_format
109109
{
110110
mulle_stacktrace_normal = 0,
111111
mulle_stacktrace_trimmed = 1,
112-
mulle_stacktrace_linefeed = 2
112+
mulle_stacktrace_linefeed = 2,
113+
mulle_stacktrace_csv = 3
113114
};
114115

115116
// stacktrace may be NULL
@@ -132,8 +133,12 @@ static inline void mulle_stacktrace_once( FILE *fp)
132133
}
133134

134135

136+
MULLE__STACKTRACE_GLOBAL
135137
int mulle_stacktrace_count_frames( void);
136138

139+
MULLE__STACKTRACE_GLOBAL
140+
char *mulle_stacktrace_symbolize_nothing( void *adresse, size_t max, char *buf, size_t len, void **userinfo);
141+
137142

138143
#ifdef __has_include
139144
# if __has_include( "_mulle-stacktrace-versioncheck.h")

0 commit comments

Comments
 (0)