Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 在调试nasm应用程序时,GDB被一行关闭_Debugging_Assembly_Gdb_Nasm - Fatal编程技术网

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时,这真的很烦人。)