运行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
相关产品推荐
相关产品推荐

