You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调试x86 NASM程序时GDB中出现文件无法打开的问题

汇编程序GDB调试时文件打开失败问题解决

问题现象

以下是一段读取文件的x86汇编简化代码:

section .data
    filename db 'txt.txt', 0x00

section .bss
    fd resd 0x01
    buff resb 0x100

section .text
    global _start

_start:
    ; open file
    mov eax, 0x05     ; SYS_OPEN
    mov ebx, filename
    xor ecx, ecx
    mov edx, 0o400    ; r--------
    int 0x80

    ; check if file was opened successfully
    cmp eax, 0x00
    js _exit
    
    mov [fd], eax    ; copy file descriptor

    ; read file
    mov eax, 0x03    ; SYS_READ
    mov ebx, [fd]
    mov ecx, buff
    mov edx, 0x100
    int 0x80

    ; close file
    mov eax, 0x06    ; SYS_CLOSE
    mov ebx, [fd]
    int 0x80

_exit:
    mov eax, 0x01    ; SYS_EXIT
    mov ebx, 0x00
    int 0x80

程序直接编译运行时能成功读取文件,但通过GDB调试时,执行SYS_OPEN后eax寄存器返回负数,说明文件打开失败。

核心原因

最常见的问题是GDB调试时的工作目录与程序直接运行时的工作目录不一致:

  • 直接运行程序时,系统会在你当前执行命令的目录下查找txt.txt
  • 启动GDB时如果没有指定程序所在目录,或者你在GDB中切换过目录,就会导致找不到目标文件,触发文件不存在的错误(对应错误码-ENOENT,即0xFFFFFFF2)

另外也可能是调试时的权限问题,但这种情况较少见,因为直接运行能成功说明权限足够。

解决方法

方法1:使用文件绝对路径修改代码

把filename改为文件的绝对路径,比如:

filename db '/home/yourusername/txt.txt', 0x00

这样无论在哪个目录下调试,都能准确定位到文件。

方法2:在GDB中切换到程序所在目录

启动GDB后,使用cd命令切换到程序和txt.txt所在的目录:

cd /path/to/your/program/directory

然后再执行run命令调试程序,此时就能正确找到文件。

方法3:启动GDB时指定工作目录

启动GDB时通过-cd参数指定工作目录:

gdb -cd /path/to/your/program/directory your_program

这样GDB启动后直接在目标目录下运行程序,不会出现路径问题。

内容的提问来源于stack exchange,提问作者lian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:57:11