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

运行sorter.s触发Segmentation fault (core dumped)的修复咨询

修复汇编排序程序中的Segmentation Fault问题

问题定位分析

你遇到的段错误触发在insertionSort函数的mov 0x8(%r13),%r15指令,结合r13指向0x0000000000403010这个全局数据段地址,核心原因大概率是内存访问无效,下面是具体排查和修复方向:


1. 检查内存分配与指针有效性

  • 确认allocate.s的逻辑:分配的内存大小是否足够容纳所有(x,y)坐标(每个坐标按8字节x+8字节y计算,n个元素需要16*n字节),分配完成后是否返回了合法的可读写指针。
  • 在主程序sorter.s中,调用allocate后立即检查返回指针:如果返回的是0或者指向只读区域,直接会导致后续访问出错。
  • 用gdb查看0x403010的内存内容:执行x/16xg 0x403010,如果显示全0、乱码或者无法访问,说明这块内存根本没被正确初始化或分配给数组。

2. 排查insertionSort的参数传递错误

x86-64 System V调用约定中,函数前几个参数默认用rdi、rsi、rdx传递,你需要:

  • 核对insertionSort.s的参数接收逻辑:确认它期望数组起始地址存在哪个寄存器里(比如是不是错误地用了r13而不是约定的寄存器)。
  • 检查sorter.s的调用代码:比如如果insertionSort需要数组指针在rdi、长度在rsi,那调用前必须把对应值加载到这些寄存器,示例代码:
; 假设array_ptr是存储数组起始地址的寄存器,array_len是元素个数
mov rdi, array_ptr
mov rsi, array_len
call insertionSort

如果参数传错寄存器,r13就会拿到错误地址,触发段错误。

3. 检查数组越界访问

  • 确认传递给insertionSort的数组长度是否正确:如果主程序传的长度比实际元素数大,排序循环就会访问到数组之外的内存,而0x403010可能刚好是数组末尾后的无效区域。
  • 查看insertionSort的循环边界:比如循环计数器是否从0到len-1,有没有多跑一次导致越界。

4. 验证坐标解析的正确性

检查parsing.s的逻辑:解析出来的(x,y)值是否正确写入了分配的内存,有没有出现写入位置偏移(比如跳过了某个元素的内存块,或者覆盖了数组边界),导致数组中存在无效的内存引用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:53:17