-
Notifications
You must be signed in to change notification settings - Fork 51
Open
Description
我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
Metadata
Metadata
Assignees
Labels
No labels