如何解决GDB读取符号时意外解混淆名称及调试信息异常问题
交叉编译程序GDB调试无法获取局部变量与行号问题
交叉编译的camera-bot程序在GDB调试时无法读取局部变量和行号,加载符号文件时触发大量unexpected demangled name错误,相关环境与输出信息如下:
GDB符号读取错误输出
(gdb) set complaints 10000 (gdb) file camera-bot Reading symbols from camera-bot... During symbol reading: unexpected demangled name 'operator<=><char, std::char_traits<char>, std::allocator<char> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' During symbol reading: unexpected demangled name 'operator<=><long long, std::ratio<1ll, 1000ll>, long long, std::ratio<1ll, 1000ll> >(std::chrono::duration<long long, std::ratio<1ll, 1000ll> > const&, std::chrono::duration<long long, std::ratio<1ll, 1000ll> > const&)' During symbol reading: unexpected demangled name 'operator<=><long long, std::ratio<1ll, 1000000ll>, long long, std::ratio<1ll, 1000000ll> >(std::chrono::duration<long long, std::ratio<1ll, 1000000ll> > const&, std::chrono::duration<long long, std::ratio<1ll, 1000000ll> > const&)' During symbol reading: unexpected demangled name '((forward<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)({parm#1}))<((forward<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)({parm#2}))) std::less<void>::operator()<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const' During symbol reading: unexpected demangled name 'decltype (((forward<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)({parm#1}))<((forward<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)({parm#2}))) std::less<void>::operator()<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const' During symbol reading: unexpected demangled name 'operator<=><char*, std::vector<char, std::allocator<char> > >(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > > const&, __gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > > const&)' During symbol reading: unexpected demangled name '((forward<char const (&) [19]>)({parm#1}))<((forward<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)({parm#2}))) std::less<void>::operator()<char const (&) [19], std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(char const (&) [19], std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const' During symbol reading: unexpected demangled name 'decltype (((forward<char const (&) [19]>)({parm#1}))<((forward<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)({parm#2}))) std::less<void>::operator()<char const (&) [19], std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(char const (&) [19], std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const' During symbol reading: unexpected demangled name '((forward<char const (&) [18]>)({parm#1}))<((forward<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>)({parm#2}))) std::less<void>::operator()<char const (&) [18], std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(char const (&) [18], std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
设备端GDB版本
pi@raspberrypi:~ $ gdb --version GNU gdb (Raspbian 13.1-3) 13.1 Copyright (C) 2023 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
交叉编译器版本
developer@e3d48b122fbf:/workspaces/RaspberryCamera$ /home/developer/opt/x-tools/armv6-rpi-linux-gnueabihf/bin/armv6-rpi-linux-gnueabihf-g++ --version armv6-rpi-linux-gnueabihf-g++ (crosstool-NG UNKNOWN - tttapa/docker-arm-cross-toolchain:armv6-rpi) 14.2.0 Copyright (C) 2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
程序调试段信息
pi@raspberrypi:~ $ readelf -S camera-bot | grep -i debug [32] .debug_aranges PROGBITS 00000000 37a088 001890 00 0 0 8 [33] .debug_info PROGBITS 00000000 37b918 2b3db9 00 0 0 1 [34] .debug_abbrev PROGBITS 00000000 62f6d1 02f1a8 00 0 0 1 [35] .debug_line PROGBITS 00000000 65e879 0e5d3d 00 0 0 1 [36] .debug_frame PROGBITS 00000000 7445b8 01df34 00 0 0 4 [37] .debug_str PROGBITS 00000000 7624ec 073658 01 MS 0 0 1 [38] .debug_line_str PROGBITS 00000000 7d5b44 0000f7 01 MS 0 0 1 [39] .debug_loclists PROGBITS 00000000 7d5c3b 11396d 00 0 0 1 [40] .debug_rnglists PROGBITS 00000000 8e95a8 01cf4a 00 0 0 1
问题分析与解决方法
- 根本原因是GDB与交叉编译器版本不兼容:用GCC 14.2.0编译的程序,调试符号使用了新的格式(比如C++20三路比较运算符的符号命名),但设备端GDB 13.1无法正确解析这些符号,导致调试信息加载失败,无法获取局部变量和行号。
- 可行解决路径:
- 升级设备端GDB到14.x版本,确保和编译器版本匹配。
- 编译时添加
-gdwarf-4参数,强制生成DWARF 4格式的调试信息(GCC 14默认生成DWARF 5,GDB 13对DWARF 5的部分特性支持不完善)。 - 检查编译参数:确认已经添加
-g/-g3生成调试信息,且没有使用-s等剥离调试信息的选项。
内容的提问来源于stack exchange,提问作者John Tracid
相关产品推荐
相关产品推荐

