Debugging 在调试nasm应用程序时,GDB被一行关闭
我刚刚在Debugging 在调试nasm应用程序时,GDB被一行关闭,debugging,assembly,gdb,nasm,Debugging,Assembly,Gdb,Nasm,我刚刚在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
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
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
及
somefile\u test.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
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
我使用
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
更奇怪的是:
(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
在Linux 5.9.14-arch1-1#1 SMP抢占Sat上,2020年12月14:37:12+0000 x86_64 GNU/Linux
显然,这是nasm中的一个问题
显然,这是nasm中的一个关键问题
这看起来像nasm中的一个bug。使用
nasm-2.14
时,它没有为我重现
GDB将只显示编译器/汇编器告诉它的源代码信息。如果汇编器输出不正确的信息,那么GDB将显示不正确的信息,并且对此无能为力
要验证问题是否在nasm
中,请运行objdump-dS somefile_test.o
并比较程序集和源代码列表。如果它们也按1关闭,那就是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 $0x5,%eax
mov ebx, 5
5: bb 05 00 00 00 mov $0x5,%ebx
cmp eax, ebx
a: 39 d8 cmp %ebx,%eax
je aisequal
c: 74 0b je 19 <aisequal>
somefile\u test.o:文件格式elf32-i386
第节的分解。正文:
00000000 :
第节.案文
芬卡:
mov-eax,5
0:b8 05 00 mov$0x5,%eax
mov-ebx,5
5:bb 05 00 mov$0x5,%ebx
cmp-eax,ebx
a:39 d8 cmp%ebx,%eax
杰艾斯平
c:74 0b je 19
注意指令和源代码是如何完美地排列的。这看起来像是nasm中的一个bug。使用
nasm-2.14
时,它没有为我重现
GDB将只显示编译器/汇编器告诉它的源代码信息。如果汇编器输出不正确的信息,那么GDB将显示不正确的信息,并且对此无能为力
要验证问题是否在nasm
中,请运行objdump-dS somefile_test.o
并比较程序集和源代码列表。如果它们也按1关闭,那就是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 $0x5,%eax
mov ebx, 5
5: bb 05 00 00 00 mov $0x5,%ebx
cmp eax, ebx
a: 39 d8 cmp %ebx,%eax
je aisequal
c: 74 0b je 19 <aisequal>
somefile\u test.o:文件格式elf32-i386
第节的分解。正文:
00000000 :
第节.案文
芬卡:
mov-eax,5
0:b8 05 00 mov$0x5,%eax
mov-ebx,5
5:bb 05 00 mov$0x5,%ebx
cmp-eax,ebx
a:39 d8 cmp%ebx,%eax
杰艾斯平
c:74 0b je 19
注意指令和源代码是如何完美地排列的。作为一种解决方法,您可以使用
display/i$pc
让gdb始终反汇编要执行的下一条指令。对于汇编程序,这通常与源代码行一样好。您可能希望将反汇编设置为intel
@NateEldredge:或布局asm
以在TUI窗口中显示反汇编,而忽略源文件。(最近的GDB似乎制作了layout reg
do registers+source layout,而不是regs+asm,所以我需要layout next
几次来修复它;特别是如果源代码使用宏,因此源代码行与指令的比例不是1:1时,这真的很烦人。),您可以使用display/i$pc
让gdb始终反汇编要执行的下一条指令。对于汇编程序,这通常与源代码行一样好。您可能希望将反汇编设置为intel
@NateEldredge:或布局asm
以在TUI窗口中显示反汇编,而忽略源文件。(最近的GDB似乎制作了layout reg
do寄存器+源代码布局,而不是regs+asm,所以我需要layout next
几次来修复它;特别是如果源代码使用宏,因此源代码行与指令的比例不是1:1时,这真的很烦人。)