[Bug libstdc++/110196] stacktrace_entry does not print which library the function was from
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Oct 10 11:33:16 GMT 2025
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110196
--- Comment #15 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to fabian_kessler@gmx.de from comment #5)
> Indeed, changing _S_init to the following improved it:
>
> ```
> static backtrace_state *_S_init() {
>
> static backtrace_state *__state = []() {
> auto getpath = []() -> std::string {
> char buf[PATH_MAX + 1];
> if (readlink("/proc/self/exe", buf, sizeof(buf) - 1) == -1) {
> return "";
> }
> std::string str(buf);
> return str.substr(0, str.rfind('/'));
> };
>
> auto exec_filename = getpath();
> return backtrace_create_state(exec_filename.c_str(), 1, _S_err_handler,
> nullptr);
> }();
> return __state;
> }
> ```
This is wrong, because exec_filename.c_str() is a temporary that goes out of
scope, and the documentation for backtrace_create_state in backtrace.h says "If
not NULL, FILENAME must point to a permanent buffer." Making exec_filename a
local static would be correct.
I also don't understand how this change had any effect on the output:
(In reply to fabian_kessler@gmx.de from comment #6)
> output is now
> ```
> 0# main at /mnt/c/Users/Febbe/workspace/test/test/main.cpp:7
> 1# __libc_start_call_main at ../sysdeps/nptl/libc_start_call_main.h:58
> 2# __libc_start_main_impl at ../csu/libc-start.c:392
> 3# _start at :0
> 4#
> ```
How does passing a filename to backtrace_create_state cause the filenames and
line numbers to be shown in frames #2 and #3? When I pass a filename to
backtrace_create_state, that doesn't happen for me.
More information about the Gcc-bugs
mailing list