调试 nasm 应用程序时,GDB 关闭了一行
GDB is off by a line when debugging a nasm application
我刚遇到 gdb
的奇怪问题,但我不确定是否遗漏了什么。
假设我有这两个文件:
somefile.asm
:
01 section .text
02
03 funca:
04 mov eax, 5
05 mov ebx, 5
06 cmp eax, ebx
07 je aisequal
08 mov ecx, 13
09 mov edx, 19
10 ret
11
12 aisequal:
13 mov ecx, 17
14 mov edx, 21
15 ret
和
somefile_test.asm
:
01 %include "somefile.asm"
02
03 section .text
04 global _start
05
06 _start:
07 xor eax, eax
08 xor ebx, ebx
09 xor ecx, ecx
10 xor edx, edx
11 call funca
12
13 mov eax, 1
14 mov ebx, 0
15 int 0x80
我编译并link它使用
nasm -f elf -g -F dwarf somefile_test.asm
ld -m elf_i386 -o somefile_test.out somefile_test.o
然后使用 gdb
:
调试我的应用程序
gdb somefile_test.out
我现在在导入的文件中设置断点:
GNU gdb (GDB) 10.1
(gdb) b somefile.asm:5
Breakpoint 1 at 0x8049000: file somefile.asm, line 5.
(gdb) r
Starting program: /<bla>/somefile_test.out
Breakpoint , funca () at somefile.asm:5
5 mov ebx, 5
现在看来,执行停在了正确的位置。下一行要执行的是 5,即 mov ebx, 5
。
但是,最后一行应该是mov eax, 5
,应该已经执行了。不是:
(gdb) i r eax
eax 0x0 0
它变得更奇怪了:
(gdb) si
6 cmp eax, ebx
(gdb) i r eax ebx
eax 0x5 5
ebx 0x0 0
现在,eax
已设置,但 ebx
尚未设置。
如果我执行下一行,它被设置为:
(gdb) si
7 je aisequal
(gdb) i r eax ebx
eax 0x5 5
ebx 0x5 5
但是,我希望程序现在跳到第 12 行(aisequal),但它没有:
(gdb) si
8 mov ecx, 13
在下一条指令上,突然转到正确的行:
(gdb) si
14 mov edx, 21
(gdb) i r eax ebx edx
eax 0x5 5
ebx 0x5 5
edx 0x0 0
以此类推:
(gdb) si
15 ret
(gdb) i r eax ebx ecx edx
eax 0x5 5
ebx 0x5 5
ecx 0x11 17
edx 0x0 0
如果我将所有代码放在一个文件中,一切都会按预期运行:
01 section .text
02 global _start
03
04 _start:
05 xor eax, eax
06 xor ebx, ebx
07 xor ecx, ecx
08 xor edx, edx
09 call funca
10
11 mov eax, 1
12 mov ebx, 0
13 int 0x80
14
15 funca:
16 mov eax, 5
17 mov ebx, 5
18 cmp eax, ebx
19 je aisequal
20 mov ecx, 13
21 mov edx, 19
22 ret
23
24 aisequal:
25 mov ecx, 17
26 mov edx, 21
27 ret
GBU gdb (GDB) 10.1
(gdb) b 16
Breakpoint 1 at 0x8049019: file singlefile.asm, line 16.
(gdb) r
Starting program: /<bla>/singlefile.out
Breakpoint 1, funca () at singlefile.asm:16
16 mov eax, 5
(gdb) i r eax ebx ecx edx
eax 0x0 0
ebx 0x0 0
ecx 0x0 0
edx 0x0 0
(gdb) si
17 mov ebx, 5
(gdb) i r eax ebx ecx edx
eax 0x5 5
ebx 0x0 0
ecx 0x0 0
edx 0x0 0
(gdb) si
18 cmp eax, ebx
(gdb) si
19 je aisequal
(gdb) si
25 mov ecx, 17
(gdb) si
26 mov edx, 21
(gdb) i r eax ebx ecx edx
eax 0x5 5
ebx 0x5 5
ecx 0x11 17
edx 0x0 0
(gdb) si
aisequal () at singlefile.asm:27
27 ret
(gdb) i r eax ebx ecx edx
eax 0x5 5
ebx 0x5 5
ecx 0x11 17
edx 0x15 21
(gdb) si
_start () at singlefile.asm:11
11 mov eax, 1
现在gdb
两天前才接触过,所以不是很熟悉。
有人可以向我解释发生了什么吗?
这是一个错误还是我遗漏了什么?
我正在使用
nasm 2.15.05-1
binutils 2.35.1-1
gdb 10.1-4
gcc 10.2.0-4
于 Linux 5.9.14-arch1-1 #1 SMP PREEMPT Sat, 12 Dec 2020 14:37:12 +0000 x86_64 GNU/Linux
显然,这是 nasm 中的 regression。
Reported 给他们。
这看起来像是 nasm
中的错误。它没有为我使用 nasm-2.14
.
重现
GDB 只会显示 compiler/assembler 告诉它的源信息。如果汇编程序输出不正确的信息,那么 GDB 将显示不正确的信息并且对此无能为力。
验证问题出在nasm
、运行 objdump -dS somefile_test.o
并比较程序集和源代码清单。如果它们也相差一个,那是 nasm
.
中的错误
这是我看到的:
somefile_test.o: file format elf32-i386
Disassembly of section .text:
00000000 <funca>:
section .text
funca:
mov eax, 5
0: b8 05 00 00 00 mov [=10=]x5,%eax
mov ebx, 5
5: bb 05 00 00 00 mov [=10=]x5,%ebx
cmp eax, ebx
a: 39 d8 cmp %ebx,%eax
je aisequal
c: 74 0b je 19 <aisequal>
请注意说明和源代码如何完美对齐。
我刚遇到 gdb
的奇怪问题,但我不确定是否遗漏了什么。
假设我有这两个文件:
somefile.asm
:
01 section .text
02
03 funca:
04 mov eax, 5
05 mov ebx, 5
06 cmp eax, ebx
07 je aisequal
08 mov ecx, 13
09 mov edx, 19
10 ret
11
12 aisequal:
13 mov ecx, 17
14 mov edx, 21
15 ret
和
somefile_test.asm
:
01 %include "somefile.asm"
02
03 section .text
04 global _start
05
06 _start:
07 xor eax, eax
08 xor ebx, ebx
09 xor ecx, ecx
10 xor edx, edx
11 call funca
12
13 mov eax, 1
14 mov ebx, 0
15 int 0x80
我编译并link它使用
nasm -f elf -g -F dwarf somefile_test.asm
ld -m elf_i386 -o somefile_test.out somefile_test.o
然后使用 gdb
:
gdb somefile_test.out
我现在在导入的文件中设置断点:
GNU gdb (GDB) 10.1
(gdb) b somefile.asm:5
Breakpoint 1 at 0x8049000: file somefile.asm, line 5.
(gdb) r
Starting program: /<bla>/somefile_test.out
Breakpoint , funca () at somefile.asm:5
5 mov ebx, 5
现在看来,执行停在了正确的位置。下一行要执行的是 5,即 mov ebx, 5
。
但是,最后一行应该是mov eax, 5
,应该已经执行了。不是:
(gdb) i r eax
eax 0x0 0
它变得更奇怪了:
(gdb) si
6 cmp eax, ebx
(gdb) i r eax ebx
eax 0x5 5
ebx 0x0 0
现在,eax
已设置,但 ebx
尚未设置。
如果我执行下一行,它被设置为:
(gdb) si
7 je aisequal
(gdb) i r eax ebx
eax 0x5 5
ebx 0x5 5
但是,我希望程序现在跳到第 12 行(aisequal),但它没有:
(gdb) si
8 mov ecx, 13
在下一条指令上,突然转到正确的行:
(gdb) si
14 mov edx, 21
(gdb) i r eax ebx edx
eax 0x5 5
ebx 0x5 5
edx 0x0 0
以此类推:
(gdb) si
15 ret
(gdb) i r eax ebx ecx edx
eax 0x5 5
ebx 0x5 5
ecx 0x11 17
edx 0x0 0
如果我将所有代码放在一个文件中,一切都会按预期运行:
01 section .text
02 global _start
03
04 _start:
05 xor eax, eax
06 xor ebx, ebx
07 xor ecx, ecx
08 xor edx, edx
09 call funca
10
11 mov eax, 1
12 mov ebx, 0
13 int 0x80
14
15 funca:
16 mov eax, 5
17 mov ebx, 5
18 cmp eax, ebx
19 je aisequal
20 mov ecx, 13
21 mov edx, 19
22 ret
23
24 aisequal:
25 mov ecx, 17
26 mov edx, 21
27 ret
GBU gdb (GDB) 10.1
(gdb) b 16
Breakpoint 1 at 0x8049019: file singlefile.asm, line 16.
(gdb) r
Starting program: /<bla>/singlefile.out
Breakpoint 1, funca () at singlefile.asm:16
16 mov eax, 5
(gdb) i r eax ebx ecx edx
eax 0x0 0
ebx 0x0 0
ecx 0x0 0
edx 0x0 0
(gdb) si
17 mov ebx, 5
(gdb) i r eax ebx ecx edx
eax 0x5 5
ebx 0x0 0
ecx 0x0 0
edx 0x0 0
(gdb) si
18 cmp eax, ebx
(gdb) si
19 je aisequal
(gdb) si
25 mov ecx, 17
(gdb) si
26 mov edx, 21
(gdb) i r eax ebx ecx edx
eax 0x5 5
ebx 0x5 5
ecx 0x11 17
edx 0x0 0
(gdb) si
aisequal () at singlefile.asm:27
27 ret
(gdb) i r eax ebx ecx edx
eax 0x5 5
ebx 0x5 5
ecx 0x11 17
edx 0x15 21
(gdb) si
_start () at singlefile.asm:11
11 mov eax, 1
现在gdb
两天前才接触过,所以不是很熟悉。
有人可以向我解释发生了什么吗?
这是一个错误还是我遗漏了什么?
我正在使用
nasm 2.15.05-1
binutils 2.35.1-1
gdb 10.1-4
gcc 10.2.0-4
于 Linux 5.9.14-arch1-1 #1 SMP PREEMPT Sat, 12 Dec 2020 14:37:12 +0000 x86_64 GNU/Linux
显然,这是 nasm 中的 regression。
Reported 给他们。
这看起来像是 nasm
中的错误。它没有为我使用 nasm-2.14
.
GDB 只会显示 compiler/assembler 告诉它的源信息。如果汇编程序输出不正确的信息,那么 GDB 将显示不正确的信息并且对此无能为力。
验证问题出在nasm
、运行 objdump -dS somefile_test.o
并比较程序集和源代码清单。如果它们也相差一个,那是 nasm
.
这是我看到的:
somefile_test.o: file format elf32-i386
Disassembly of section .text:
00000000 <funca>:
section .text
funca:
mov eax, 5
0: b8 05 00 00 00 mov [=10=]x5,%eax
mov ebx, 5
5: bb 05 00 00 00 mov [=10=]x5,%ebx
cmp eax, ebx
a: 39 d8 cmp %ebx,%eax
je aisequal
c: 74 0b je 19 <aisequal>
请注意说明和源代码如何完美对齐。