Updated: October 28, 2024 |
Occasionally, it may be useful to backtrace a collection of threads in a coherent manner. You can accomplish this by freezing all the threads, backtracing the threads, and then unfreezing them. For example:
bt_accessor_t acc; int count; hold_all_threads(); for (i=0; i < max_thread; i++) { if (bt_init_accessor(&acc, BT_PROCESS, pid, i) == -1) { fprintf( stderr, "%s:%i %s (%i)%s\n", __FUNCTION__, __LINE__, "bt_init_accessor", errno, strerror(errno)); return -1; } if (bt_set_flags(&acc, BTF_LIVE_BACKTRACE, 1) == -1) { fprintf( stderr, "%s:%i %s (%i)%s\n", __FUNCTION__, __LINE__, "bt_set_flags", errno, strerror(errno)); return -1; } count = bt_get_backtrace(&acc, addrs, len); ... if (bt_release_accessor(&acc) == -1) { fprintf( stderr, "%s:%i %s (%i)%s\n", __FUNCTION__, __LINE__, "bt_release_accessor", errno, strerror(errno)); return -1; } save_addrs(addrs); } cont_all_threads();