簡體   English   中英

調試 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

我編譯並鏈接它使用

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

現在看來,執行在正確的 position 處停止。 要執行的下一行是 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 的回歸

向他們報告了。

這看起來像nasm中的錯誤。 它沒有為我使用nasm-2.14重現。

GDB 只會顯示編譯器/匯編器告訴它的源信息。 如果匯編器輸出了不正確的信息,那么 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    $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>

請注意說明和源代碼是如何完美排列的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM