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

macOS平台NASM汇编创建Socket无效果,C代码正常的问题排查

macOS平台NASM汇编创建Socket无效果,C代码正常的问题排查

我帮你一步步分析可能的问题,毕竟C代码能正常跑,说明逻辑本身没问题,大概率是汇编代码里的细节没处理好:

  • 先确认Socket是否真的创建成功了
    你C代码里有tryElse宏检查fd是否错误,但NASM代码里完全没做错误判断!macOS的syscall如果失败,会在rax寄存器返回负的错误码(比如-1对应EPERM,-2对应ENOENT之类的)。你可以在syscall之后加一段检查逻辑,比如:

    syscall
    ; 检查返回值是否小于0(创建失败)
    cmp rax, 0
    jl .socket_fail
    ; 保存文件描述符到rbx,方便后续调试
    mov rbx, rax
    

    然后加个错误处理的分支,用write syscall把错误信息输出到stderr,这样就能知道Socket是不是根本没创建出来。

  • 检查pauseHere宏的实现是否正确
    如果你的pauseHere宏没正确让进程暂停,程序可能直接退出了,你还没来得及用lsof查询就没了。macOS下pause的syscall号是0x2000022(x86_64架构),正确的宏实现应该是:

    %macro pauseHere 0
        mov rax, 0x2000022
        syscall
    %endmacro
    

    要是宏里的syscall号错了(比如用了Linux的号),进程会直接退出,自然看不到Socket。

  • 确认编译链接的方式没出错
    汇编代码的编译链接细节很重要:

    1. 用NASM编译时要指定macho64格式:nasm -f macho64 your_code.asm -o your_code.o
    2. 链接时最好指定macOS最低版本(避免新系统兼容性问题):ld -o your_program your_code.o -macosx_version_min 10.15
    3. 如果你的pauseHere是调用libc的pause函数,那得用gcc链接(ld默认不链libc):gcc -o your_program your_code.o
  • 验证你查lsof用的PID是否正确
    有时候可能手滑拿错了PID,或者程序已经意外退出了。运行汇编程序后,先执行ps aux | grep your_program确认进程确实在运行,再用正确的PID去跑lsof -i -a -p <PID>。

另外补充下:你用的Socket syscall号0x2000097是对的(macOS x86_64下SYS_socket的号是0x97,加上0x2000000的架构前缀),参数AF_INET=2、SOCK_STREAM=1、protocol=0也和C代码一致,这部分没问题。

备注:内容来源于stack exchange,提问作者Arthur Andrade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 09:00:30