GDB 符号适用于 "break" 和 "print",但 "list" 因 "No debugging symbols found" 而失败
GDB symbols work for "break" and "print", but "list" fails with "No debugging symbols found"
有大量关于 GDB 和“未找到调试符号”警告的问题和答案,但所有这些都假设调试符号不是 .elf 文件的一部分。
我正在处理以下问题:
- 我有一个带有调试符号的 .elf 文件。我可以通过执行 objdump 并查看带有子例程标签的反汇编来验证这一点。
- 当我
load
.elf 文件时,它会正确加载文件。
- 当我执行
list
列出 C 代码时,我得到 No symbol table is loaded. Use the "file" command.
- 但是,我仍然可以做
break main
或 p/x global_cntr
!
- 当我执行
file progmem.elf
时,行为没有区别:我得到 (No debugging symbols found in progmem.elf)
,但断点等仍然有效。
- GCC 和 GDB 使用相同版本的 GCC 工具链
- 我尝试使用
-gdwarf-3
而不是 -ggdb
。没有区别。
我迷路了...
如果重要的话,我正在使用 RISC-V 工具链。
这是我的 Makefile 的摘录:
TARGET = $(TOOLS_PREFIX)/riscv32-unknown-elf
AS = $(TARGET)-as
ASFLAGS = -march=$(MARCH) -mabi=ilp32
LD = $(TARGET)-gcc
LDFLAGS = -march=$(MARCH) -g -mabi=ilp32 -Wl,-Tsections.lds,-Map,progmem.map -ffreestanding -nostartfiles -Wl,--no-relax
CC = $(TARGET)-gcc
CFLAGS = -march=$(MARCH) -g -ggdb -mno-div -mabi=ilp32 -Wall -Wextra -pedantic -DCPU_FREQ=$(CPU_FREQ_MHZ)000000 $(CC_OPT)
...
progmem.elf: $(OBJ_FILES) top_defines.h sections.lds Makefile
$(LD) $(LDFLAGS) -o $@ $(OBJ_FILES) -lm
这是我的 GDB 会话日志:
/opt/riscv32im/bin//riscv32-unknown-elf-gdb progmem.elf \
-ex "target remote localhost:3333"
...
Remote debugging using localhost:3333
0x0000002e in rdcycle64 ()
(gdb)
(gdb)
(gdb) monitor soft_reset_halt
requesting target halt and executing a soft reset
(gdb) file progmem.elf
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from progmem.elf...
(No debugging symbols found in progmem.elf)
(gdb) br main
Breakpoint 1 at 0x5d6
(gdb) load
Loading section .memory, size 0x5790 lma 0x0
Start address 0x0, load size 22416
Transfer rate: 23 KB/sec, 11208 bytes/write.
(gdb) c
Continuing.
Program stopped.
0x000005d6 in main ()
(gdb) p/x global_cntr
= 0x0
(gdb) l
No symbol table is loaded. Use the "file" command.
(gdb)
I have a .elf file with debugging symbols. I can verify this by doing objdump, and seeing a disassembly with the subroutine labels being present.
调试符号与符号不同。对于拆卸,您只需要后者。对于源列表,您需要前者。
I can still do things like break main or p/x global_cntr!
这些也只需要符号 table。
您可以确认您没有使用objdump -g progmem.elf
或readelf -wi progmem.elf
的调试符号。
您的命令行看起来应该包含调试符号,但无法说明您对 sections.lds
链接描述文件中的 .debug_*
部分做了什么。可能你丢弃了它们,这可以解释为什么它们不存在。
更新:
Do you by any chance has an example sections.lds file that has them included?
ld --verbose
应该打印默认链接描述文件。这是一个 example.
我原来的链接描述文件如下:
SECTIONS {
.memory : {
. = 0x00000;
start*(.text);
*(.text);
*(*);
end = .;
}
}
我怀疑我的问题是由 catchall *(*);
引起的,它将所有部分都移到了 .text 部分。
我将其替换为以下脚本:
MEMORY
{
ram (ax) : ORIGIN = 0x00000000, LENGTH = 16K
}
SECTIONS {
}
在此之后,包含 .debug_*
个符号。
这个脚本应该通过更精确地放置各个部分来改进,但它足以解锁我。
有大量关于 GDB 和“未找到调试符号”警告的问题和答案,但所有这些都假设调试符号不是 .elf 文件的一部分。
我正在处理以下问题:
- 我有一个带有调试符号的 .elf 文件。我可以通过执行 objdump 并查看带有子例程标签的反汇编来验证这一点。
- 当我
load
.elf 文件时,它会正确加载文件。 - 当我执行
list
列出 C 代码时,我得到No symbol table is loaded. Use the "file" command.
- 但是,我仍然可以做
break main
或p/x global_cntr
! - 当我执行
file progmem.elf
时,行为没有区别:我得到(No debugging symbols found in progmem.elf)
,但断点等仍然有效。 - GCC 和 GDB 使用相同版本的 GCC 工具链
- 我尝试使用
-gdwarf-3
而不是-ggdb
。没有区别。
我迷路了...
如果重要的话,我正在使用 RISC-V 工具链。
这是我的 Makefile 的摘录:
TARGET = $(TOOLS_PREFIX)/riscv32-unknown-elf
AS = $(TARGET)-as
ASFLAGS = -march=$(MARCH) -mabi=ilp32
LD = $(TARGET)-gcc
LDFLAGS = -march=$(MARCH) -g -mabi=ilp32 -Wl,-Tsections.lds,-Map,progmem.map -ffreestanding -nostartfiles -Wl,--no-relax
CC = $(TARGET)-gcc
CFLAGS = -march=$(MARCH) -g -ggdb -mno-div -mabi=ilp32 -Wall -Wextra -pedantic -DCPU_FREQ=$(CPU_FREQ_MHZ)000000 $(CC_OPT)
...
progmem.elf: $(OBJ_FILES) top_defines.h sections.lds Makefile
$(LD) $(LDFLAGS) -o $@ $(OBJ_FILES) -lm
这是我的 GDB 会话日志:
/opt/riscv32im/bin//riscv32-unknown-elf-gdb progmem.elf \
-ex "target remote localhost:3333"
...
Remote debugging using localhost:3333
0x0000002e in rdcycle64 ()
(gdb)
(gdb)
(gdb) monitor soft_reset_halt
requesting target halt and executing a soft reset
(gdb) file progmem.elf
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from progmem.elf...
(No debugging symbols found in progmem.elf)
(gdb) br main
Breakpoint 1 at 0x5d6
(gdb) load
Loading section .memory, size 0x5790 lma 0x0
Start address 0x0, load size 22416
Transfer rate: 23 KB/sec, 11208 bytes/write.
(gdb) c
Continuing.
Program stopped.
0x000005d6 in main ()
(gdb) p/x global_cntr
= 0x0
(gdb) l
No symbol table is loaded. Use the "file" command.
(gdb)
I have a .elf file with debugging symbols. I can verify this by doing objdump, and seeing a disassembly with the subroutine labels being present.
调试符号与符号不同。对于拆卸,您只需要后者。对于源列表,您需要前者。
I can still do things like break main or p/x global_cntr!
这些也只需要符号 table。
您可以确认您没有使用objdump -g progmem.elf
或readelf -wi progmem.elf
的调试符号。
您的命令行看起来应该包含调试符号,但无法说明您对 sections.lds
链接描述文件中的 .debug_*
部分做了什么。可能你丢弃了它们,这可以解释为什么它们不存在。
更新:
Do you by any chance has an example sections.lds file that has them included?
ld --verbose
应该打印默认链接描述文件。这是一个 example.
我原来的链接描述文件如下:
SECTIONS {
.memory : {
. = 0x00000;
start*(.text);
*(.text);
*(*);
end = .;
}
}
我怀疑我的问题是由 catchall *(*);
引起的,它将所有部分都移到了 .text 部分。
我将其替换为以下脚本:
MEMORY
{
ram (ax) : ORIGIN = 0x00000000, LENGTH = 16K
}
SECTIONS {
}
在此之后,包含 .debug_*
个符号。
这个脚本应该通过更精确地放置各个部分来改进,但它足以解锁我。