Skip to content

debug可执行文件时出现段错误 #29

@yilin0518

Description

@yilin0518

我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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions