我有两个源文件(在C中),它们具有相同名称的全局变量。全局变量是静态的。如果我使用nm
转储目标文件中的符号,我可以看到包含调试信息:
hostname:ble_app_hrs username$ find Debug -name '*.o' -exec /usr/local/gcc-arm-none-eabi-4_8-2014q2/bin/arm-none-eabi-nm -o -l {} \; | grep m_user_array_size
Debug/components/libraries/gpiote/app_gpiote.o:00000000 b m_user_array_size GNU_ARM_Eclipse/nRF51_SDK_7/components/libraries/gpiote/app_gpiote.c:36
Debug/components/libraries/timer/app_timer.o:00000000 b m_user_array_size GNU_ARM_Eclipse/nRF51_SDK_7/components/libraries/timer/app_timer.c:131
但是,如果我在链接完成后从ELF文件中转储符号,则看起来调试信息已被剥离出来用于这些重复的符号。这是正常的行为 - 即。 what's described here是否会自动发生?
hostname:ble_app_hrs username$ /usr/local/gcc-arm-none-eabi-4_8-2014q2/bin/arm-none-eabi-nm -o -l Debug/ble_app_hrs.elf | grep user
Debug/ble_app_hrs.elf:0001cb50 T app_gpiote_user_enable GNU_ARM_Eclipse/nRF51_SDK_7/components/libraries/gpiote/app_gpiote.c:224
Debug/ble_app_hrs.elf:0001ca88 T app_gpiote_user_register GNU_ARM_Eclipse/nRF51_SDK_7/components/libraries/gpiote/app_gpiote.c:190
Debug/ble_app_hrs.elf:200020a4 B m_enabled_users_mask.6444
Debug/ble_app_hrs.elf:200020c0 B m_gpiote_user_id.6603
Debug/ble_app_hrs.elf:20002080 B m_user_array_size.5782
Debug/ble_app_hrs.elf:200020a8 B m_user_array_size.6446
Debug/ble_app_hrs.elf:200020a9 B m_user_count.6445
Debug/ble_app_hrs.elf:20002084 B mp_users.5783
Debug/ble_app_hrs.elf:200020ac B mp_users.6443
Debug/ble_app_hrs.elf:0001d688 t user_id_get.5752.4484 GNU_ARM_Eclipse/nRF51_SDK_7/components/libraries/timer/app_timer.c:1056
Debug/ble_app_hrs.elf:0001d2cc t user_op_alloc.5716.4521 GNU_ARM_Eclipse/nRF51_SDK_7/components/libraries/timer/app_timer.c:794
Debug/ble_app_hrs.elf:0001d2b4 t user_op_enque.5691.4546 GNU_ARM_Eclipse/nRF51_SDK_7/components/libraries/timer/app_timer.c:781
请注意,并非所有调试信息都被剥离 - 它仍然存在于app_gpiote_user_enable
之类的符号中。如果我尝试打印其中一个重复项,例如m_user_array_size
,gdb会告诉我No symbol "m_user_array_size" in current context.
但是,如果我打印app_gpiote_user_enable
,gdb会对此感到满意。
.5782
等数字是多少?这有助于我将符号映射回目标文件吗?注意:我不仅仅是重命名变量 - 它们都是在第三方库中定义的。
答案 0 :(得分:1)
重复的符号打印如下:p' f2.c' :: x。它解释为in this section of GDB manual。
使用地址打印可以这样做(假设0x60103c是整数变量的地址):
print *(int*)0x60103c
只有当-flto标志用于构建可执行文件时,我才看到符号末尾的数字。这(默认为Ubuntu 14.04工具链)也打破了gdb从其他文件打印符号的能力(它打印错误的文件)。对此的一种解决方法是在调试时不使用-flto进行构建。