Open yilin0518 opened 4 weeks ago
我debug的可执行文件时public文件夹下的sort_test7,在执行这个文件的时候出现了段错误。经过我debug,发现该错误出现在该文件的tea代码中MergeSort函数在if循环中第一次调用自身这个位置。我把生成的汇编代码仔仔细细的看了一遍,并把大部分过程中目标寄存器的值进行了注释标注,发现实际运行逻辑并没有问题,但是问题出现段错误的地方是第一次调用自身的ldp x29, x30, [sp], #16 这个地方。下面我给出对应该函数的汇编代码,并给出gdb的调试出现错误的位置:
(gdb) x/10i $pc => 0x400c30 <bb25+88>: ldp x29, x30, [sp], #16 0x400c34 <bb25+92>: ldr x15, [sp], #8 0x400c38 <bb25+96>: ldp x13, x14, [sp], #16 0x400c3c <bb25+100>: ldp x11, x12, [sp], #16 0x400c40 <bb25+104>: ldp x9, x10, [sp], #16 0x400c44 <bb25+108>: mov x9, x0 0x400c48 <bb25+112>: mov x9, x13 0x400c4c <bb25+116>: mov x10, #0x1 // #1 0x400c50 <bb25+120>: add x9, x9, x10 0x400c54 <bb25+124>: mov x10, x9
MergeSort: //bb24: bb24: // %r390 = add i32 0, 0 mov x16, #0 sub sp, sp, x16 mov x12, x0 //array mov x11, x1 //p mov x10, x2 //q mov x9, #0 mov x13, x9 // %r391 = add i32 0, 0 mov x9, #0 mov x15, x9 // %r392 = add i32 0, 0 mov x9, #0 // %r393 = add i32 %r241, 0 mov x11, x11 // %r394 = add i32 0, 0 mov x9, #0 // %r395 = add i32 %r243, 0 mov x14, x10 // %r247 = add i32 %r393, 0 mov x9, x11 // %r249 = add i32 %r395, 0 mov x10, x14 // %r245 = icmp slt i32 %r247, %r249 cmp x9, x10 // br i1 %r245, label %bb25, label %bb26 b.lt bb25 b bb26 //bb25: bb25: // %r252 = add i32 %r393, 0 mov x9, x11 //p // %r254 = add i32 %r395, 0 mov x10, x14 //q // %r255 = add i32 %r252, %r254 add x9, x9, x10 //p+q // %r256 = sdiv i32 %r255, 2 mov x10, #2 sdiv x9, x9, x10 //(p+q)/2 // %r398 = add i32 %r256, 0 mov x13, x9 //(p+q)/2 // %r261 = getelementptr i32, i32* %r240, i32 0 mov x9, #0 mov x10, #8 mul x9, x9, x10 add x9, x12, x9 //array // %r263 = add i32 %r393, 0 mov x10, x11 //p // %r265 = add i32 %r398, 0 mov x15, x13 //(p+q)/2 // %r259 = call i32 @MergeSort(i32* %r261, i32 %r263, i32 %r265) mov x0, x9 mov x1, x10 mov x2, x15 stp x9, x10, [sp, #-16]! stp x11, x12, [sp, #-16]! stp x13, x14, [sp, #-16]! str x15, [sp, #-8]! stp x29, x30, [sp, #-16]! mov x29, sp bl MergeSort ldp x29, x30, [sp], #16 //在此处出现了段错误 ldr x15, [sp], #8 ldp x13, x14, [sp], #16 ldp x11, x12, [sp], #16 ldp x9, x10, [sp], #16 mov x9, x0 //return value ,is 0 // %r399 = add i32 %r259, 0 // %r267 = add i32 %r398, 0 mov x9, x13 //(p+q)/2 // %r268 = add i32 %r267, 1 mov x10, #1 add x9, x9, x10 //(p+q)/2+1 // %r400 = add i32 %r268, 0 mov x10, x9 //(p+q)/2+1 // %r272 = getelementptr i32, i32* %r240, i32 0 mov x9, #0 mov x15, #8 mul x9, x9, x15 add x15, x12, x9 //array // %r274 = add i32 %r400, 0 mov x10, x10 // %r276 = add i32 %r395, 0 mov x9, x14 //q // %r270 = call i32 @MergeSort(i32* %r272, i32 %r274, i32 %r276) mov x0, x15 //array mov x1, x10 //(p+q)/2+1 = tmp mov x2, x9 //q stp x9, x10, [sp, #-16]! stp x11, x12, [sp, #-16]! stp x13, x14, [sp, #-16]! str x15, [sp, #-8]! stp x29, x30, [sp, #-16]! mov x29, sp bl MergeSort ldp x29, x30, [sp], #16 ldr x15, [sp], #8 ldp x13, x14, [sp], #16 ldp x11, x12, [sp], #16 ldp x9, x10, [sp], #16 mov x9, x0 // %r401 = add i32 %r270, 0 // %r280 = getelementptr i32, i32* %r240, i32 0 mov x9, #0 mov x10, #8 mul x9, x9, x10 add x12, x12, x9 // %r282 = add i32 %r393, 0 mov x11, x11 // %r284 = add i32 %r398, 0 mov x10, x13 // %r286 = add i32 %r395, 0 mov x9, x14 // %r278 = call i32 @Merge(i32* %r280, i32 %r282, i32 %r284, i32 %r286) mov x0, x12 mov x1, x11 mov x2, x10 mov x3, x9 stp x9, x10, [sp, #-16]! stp x11, x12, [sp, #-16]! stp x13, x14, [sp, #-16]! str x15, [sp, #-8]! stp x29, x30, [sp, #-16]! mov x29, sp bl Merge ldp x29, x30, [sp], #16 ldr x15, [sp], #8 ldp x13, x14, [sp], #16 ldp x11, x12, [sp], #16 ldp x9, x10, [sp], #16 mov x9, x0 // %r402 = add i32 %r278, 0 mov x9, x9 // br label %bb27 b bb27 //bb26: bb26: // br label %bb27 b bb27 //bb27: bb27: // %r396 = phi i32 [ %r402, %bb25 ], [ %r390, %bb26 ] // %r397 = phi i32 [ %r398, %bb25 ], [ %r391, %bb26 ] // ret i32 0 mov x9, #0 mov x0, x9 mov sp, x29 ret
猜测是Merge函数进行局部变量的数组操作时,出现了错误导致修改到了其他栈帧的寄存器,我看看你的Merge函数的fpoffset。
我debug的可执行文件时public文件夹下的sort_test7,在执行这个文件的时候出现了段错误。经过我debug,发现该错误出现在该文件的tea代码中MergeSort函数在if循环中第一次调用自身这个位置。我把生成的汇编代码仔仔细细的看了一遍,并把大部分过程中目标寄存器的值进行了注释标注,发现实际运行逻辑并没有问题,但是问题出现段错误的地方是第一次调用自身的ldp x29, x30, [sp], #16 这个地方。下面我给出对应该函数的汇编代码,并给出gdb的调试出现错误的位置: