Re: Multiple Values and GC (libbacktrace)

Basile Starynkevitch <[email protected]> Thu, 16 Sep 2021 08:03:15 +0200
Newsgroups gmane.lisp.scheme.bigloo
Message-ID <[email protected]>
On 16/09/2021 07:44, [email protected] wrote:
> I have conducted a very quick experiment:
>
> -----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
> cat > bt.c <<EOF
> #include <backtrace.h>
>
> struct backtrace_state *bt_state;
>
> static int cb(void *data, uintptr_t pc, const char *filename, int lineno, const char *function) {
>     printf("%s:%d %s\n", filename ? filename : "", lineno, function ? function : "");
>     return 0;
> }
>
> static void cbe(void *data, const char *msg, int errnum) {
>     fprintf(stderr, "%s(%)", msg, errnum);
> }
>
> long bt_init() {
>     bt_state = backtrace_create_state(0L, 0, cbe, 0L);
> }
>
> long bt_test() {
>     backtrace_full(bt_state, 0, cb, cbe, 0L);
> }
>     
> EOF
> -----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
>
> Then I grabbed the maze.scm from the bglstone suite and inserted a
> call to bt_init at the beginning of the execution and a call to bt_test
> in the middle of the benchmark. I have then compiled with:
>
> -----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
> gcc -c -I ../include/ -c bt.c
> bigloo -unsafe -O3 maze.scm bt.o ../lib/libbacktrace.a -cg -glines
> ./a.out | demangle
> -----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
>
> I obtained
>
> -----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
> /tmp/BT/libbacktrace/maze.scm:489 print-hexmaze@maze
> /tmp/BT/libbacktrace/maze.scm:435 pmaze@maze
> /tmp/BT/libbacktrace/maze.scm:805 &<@anonymous:1833>@maze
> objs/obj_u/Ieee/port.c:3744 with-output-to-file@__r4_ports_6_10_1
> /tmp/BT/libbacktrace/maze.scm:804 do-bench@maze
> /tmp/BT/libbacktrace/maze.scm:821 main@maze
> /tmp/BT/libbacktrace/maze.scm:1 bigloo_main
> -----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
>
> Which is, I must admit, very nice. I will definitively have to look at
> libbacktrace for next Bigloo releases...
>
> Thanks again for having drawn our attention to that library that, personally,
> I didn't know.
>
>

The caveats are:

  * Unix signals. Ian Lance Taylor worked hard to follow
    signal-safety(7)
    <https://man7.org/linux/man-pages/man7/signal-safety.7.html>, but
    your callbacks to libbacktrace might not follow these rules (in
    particular if you call backtracing routines from inside your signal
    handler)
  * Tail call optimizations done by GCC (not Bigloo!)
  * libbacktrace might not work properly on other OSes....

In practice, compiling on Linux with optimization and DWARF debugging 
information is helpful. So gcc -O3 -g.


On Linux, dladdr(3) 
<https://man7.org/linux/man-pages/man3/dladdr.3.html> could be helpful.


Hope this helps.


Cheers

-- 
Basile Starynkevitch                  <[email protected]>
(only mine opinions / les opinions sont miennes uniquement)
92340 Bourg-la-Reine, France
web page: starynkevitch.net/Basile/