假设我在gps_anetenova_m10478.c
中声明了一个静态变量,如下所示:
static app_timer_id_t m_gps_response_timeout_timer_id;
我的代码中有一些缓冲区溢出错误,在某些时候,在内存中m_gps_response_timeout_timer_id
之前写入变量就会覆盖它。
我可以使用Eclipse的GDB客户端中的“表达式”视图找出内存中m_gps_response_timeout_timer_id
的位置。只需输入&m_gps_response_timeout_timer_id
即可。但是如何判断哪个变量在内存中紧跟在它之前?
有没有办法将此信息存入ld
生成的.map文件中?目前我只看到源文件:
.bss 0x000000002000011c 0x0 _build/debug_leds.o
.bss 0x000000002000011c 0x11f8 _build/gps_antenova_m10478.o
.bss 0x0000000020001314 0x161c _build/gsm_ublox_sara.o
答案 0 :(得分:2)
老实说,我对Eclipse不够了解,无法在Eclipse中轻松实现这一目标。您可能正在寻找的工具是objdump
或nm
。 objdump
的一个示例就是运行objdump -x <myELF>
。然后,这将返回文件中的所有符号,它们所在的部分以及它们的地址。然后,您必须根据地址手动搜索您感兴趣的变量。
objdump -x <ELFfile>
将按以下方式提供输出:
000120d8 g F .text 0000033c bit_string_copy
00015ea4 g O .bss 00000004 overflow_bit
00015e24 g .bss 00000000 __bss_start
00011ce4 g F .text 0000003c main
00014b6c g F .text 0000008c integer_and
第一列是地址,第四列是该部分,第五列是该字段的长度。
nm <ELFfile>
提供以下内容:
00015ea8 B __bss_end
00015e24 B __bss_start
0000c000 T _start
00015e20 D zero_constant
00015e24 b zero_constant_itself
第一列是地址,第二列是该部分。 D / d是数据,B / b是BSS,T / t是文本。其余部分可以在联机帮助页中找到。 nm
也接受-n
标记,按行号对数字地址进行排序。