For me, backtrace_symbols() does not show line-numbers. Is this the
intended behaviour?

I'm using:
    OpenBSD jules-obsd 6.7 GENERIC.MP#182 amd64
    libexecinfo-0.3p2v0

With 'cc -g -Wl,--export-dynamic', i'm getting backtraces like:

    0x69854ee369 <bar+41> at ./foo.c.exe
    0x69854ee477 <foo+23> at ./foo.c.exe
    0x69854ee4be <main+30> at ./foo.c.exe
    0x69854ee13b <__start+315> at ./foo.c.exe

[gdb can show line numbers on the same executable, so the information
is definitely in the executable somewhere.]

I'm testing with this code:

====
#include <err.h>
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>

void bar()
{
    void*   bt[20];
    char**  strings;
    int     i;
    int     d;
    
    d = backtrace(bt, sizeof(bt) / sizeof(bt[0]));
    if (d == -1)
        errx(1, "backtrace");

    strings = backtrace_symbols(bt, d);

    if (strings == NULL)
        errx(1, "backtrace_symbols");

    for (i = 0; i < d; i++)
        printf("    %s\n", strings[i]);

    free(strings);
}

void foo(void)
{
    bar();
}

int main(void)
{
    foo();
    return 0;
}
===

Build with:
    cc -g -o foo.c.exe foo.c -I /usr/local/include -g -L /usr/local/lib
-lexecinfo -Wl,--export-dynamic

Run:
    ./foo.c.exe

Output:
    0x69854ee369 <bar+41> at ./foo.c.exe
    0x69854ee477 <foo+23> at ./foo.c.exe
    0x69854ee4be <main+30> at ./foo.c.exe
    0x69854ee13b <__start+315> at ./foo.c.exe

====


Also, here's a small diff for /usr/local/man/man3/backtrace.3, which
makes the code example more directly usable and fixes a misprint of
'\n':

--- /usr/local/man/man3/backtrace.3     Fri May  8 19:49:25 2020
+++ backtrace.3 Fri Jul 17 11:09:15 2020
@@ -63,14 +63,17 @@
 The following code fragment illustrates the use of the backtrace
 functionality:
 .Bd -literal -offset indent
+#include <execinfo.h>
+#include <err.h>
+
 void
 print_backtrace(void)
 {
-       void                    *bt[BT_MAX_DEPTH];
+       void                    *bt[20];
        char                    **strings;
        int                     i, d;
 
-        d = backtrace(bt, BT_MAX_DEPTH);
+        d = backtrace(bt, sizeof(bt) / sizeof(bt[0]));
        if (d == -1)
                errx(1, "backtrace");
 
@@ -80,7 +83,7 @@
                errx(1, "backtrace_symbols");
 
        for (i = 0; i < d; i++)
-               printf("%s\n", strings[i]);
+               printf("%s\\n", strings[i]);
 
        free(strings);
 }

Thanks,

- Jules

-- 
http://op59.net

Reply via email to