运行libc测试程序data about异常问题

47 views
Skip to first unread message

罗辉

unread,
Sep 12, 2012, 4:52:00 AM9/12/12
to rt-threa...@googlegroups.com
rtthread版本:svn-r2255
硬件平台:tms320dm365
运行libc测试程序时会出现data about异常,经过排查,发现是内存访问对齐问题,异常现象打印信息如下:

finsh />libc_ex1()
create a succeeded 0
create b succeeded 0
Starting process a
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaStarting process b
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
。。。。。。。。。。。略去若干行。。。。。。。。。。。。。。。。。
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbExecption:
r00:0x00000000 r01:0x600000d3 r02:0x800a41d8 r03:0xb5f3f5db
r04:0x00000000 r05:0x00000000 r06:0x00000000 r07:0x00000000
r08:0x00000000 r09:0x00000000 r10:0x00000000
fp :0x800781ac ip :0x00000000
sp :0x89f48104 lr :0x20401819 pc :0x8000170c
cpsr:0xa00000d3
data abort
thread - tidle stack:
 thread  pri  status      sp     stack size max used   left tick  error
-------- ---- ------- ---------- ---------- ---------- ---------- ---
pth01    0xc0 close   0x0000007c 0x00000800 0x0000077c 0x00000002 000
pth00    0xc0 close   0x0000007c 0x00000800 0x0000077c 0x00000004 000
tidle    0xff ready   0x00000054 0x00000100 0x000000a8 0x0000000b 000
timer    0x08 suspend 0x0000007c 0x00000200 0x0000007c 0x00000009 000
tshell   0x14 suspend 0x000001dc 0x00001000 0x00000884 0x00000007 000
shutdown...
(0) assert failed at rt_hw_cpu_shutdown:189

对比反汇编代码后
800016b8:       eb003e9b        bl      8001112c <rt_hw_interrupt_disable>
800016bc:       e1a03000        mov     r3, r0
800016c0:       e50b3014        str     r3, [fp, #-20]
800016c4:       e59f0184        ldr     r0, [pc, #388]  ; 80001850 <rt_thread_idle_excute+0x21c>
800016c8:       ebffffc0        bl      800015d0 <rt_list_isempty>
800016cc:       e1a03000        mov     r3, r0
800016d0:       e3530000        cmp     r3, #0
800016d4:       1a00002f        bne     80001798 <rt_thread_idle_excute+0x164>
800016d8:       e59f3170        ldr     r3, [pc, #368]  ; 80001850 <rt_thread_idle_excute+0x21c>
800016dc:       e5933000        ldr     r3, [r3]
800016e0:       e2433030        sub     r3, r3, #48     ; 0x30
800016e4:       e50b3010        str     r3, [fp, #-16]
800016e8:       e51b3010        ldr     r3, [fp, #-16]
800016ec:       e5933024        ldr     r3, [r3, #36]   ; 0x24
800016f0:       e50b300c        str     r3, [fp, #-12]
800016f4:       e51b300c        ldr     r3, [fp, #-12]
800016f8:       e3530000        cmp     r3, #0
800016fc:       0a000007        beq     80001720 <rt_thread_idle_excute+0xec>
80001700:       e51b300c        ldr     r3, [fp, #-12]
80001704:       e5932038        ldr     r2, [r3, #56]   ; 0x38
80001708:       e51b3010        ldr     r3, [fp, #-16]
8000170c:       e1520003        cmp     r2, r3   --------------------------》产生异常点
80001710:       1a000002        bne     80001720 <rt_thread_idle_excute+0xec>
80001714:       e51b300c        ldr     r3, [fp, #-12]
80001718:       e3a02000        mov     r2, #0
8000171c:       e5832038        str     r2, [r3, #56]   ; 0x38
80001720:       e51b3010        ldr     r3, [fp, #-16]
80001724:       e2833030        add     r3, r3, #48     ; 0x30
80001728:       e1a00003        mov     r0, r3
8000172c:       ebffff8f        bl      80001570 <rt_list_remove>

对应c程序如下:
void rt_thread_idle_excute(void)
{
    /* check the defunct thread list */
    if (!rt_list_isempty(&rt_thread_defunct))
    {
        rt_base_t lock;
        rt_thread_t thread;
#ifdef RT_USING_MODULE
        rt_module_t module = RT_NULL;
#endif
        RT_DEBUG_NOT_IN_INTERRUPT;

        /* disable interrupt */
        lock = rt_hw_interrupt_disable();

        /* re-check whether list is empty */
        if (!rt_list_isempty(&rt_thread_defunct))
        {
            /* get defunct thread */
            thread = rt_list_entry(rt_thread_defunct.next, struct rt_thread, tlist);
#ifdef RT_USING_MODULE
            /* get thread's parent module */
            module = (rt_module_t)thread->module_id;

            /* if the thread is module's main thread */
            if (module != RT_NULL && module->module_thread == thread)
            {
                /* detach module's main thread */
                module->module_thread = RT_NULL;
            }
#endif
            /* remove defunct thread */
            rt_list_remove(&(thread->tlist));
            /* invoke thread cleanup */
            if (thread->cleanup != RT_NULL)
                thread->cleanup(thread);

            /* if it's a system object, not delete it */
            if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE)
            {
                /* enable interrupt */
                rt_hw_interrupt_enable(lock);
                return;
            }
        }
        else
        {
            /* enable interrupt */
            rt_hw_interrupt_enable(lock);

            /* may the defunct thread list is removed by others, just return */
            return;
        }

        /* enable interrupt */
        rt_hw_interrupt_enable(lock);

#ifdef RT_USING_HEAP
#if defined(RT_USING_MODULE) && defined(RT_USING_SLAB)
        /* the thread belongs to an application module */
        if (thread->flags & RT_OBJECT_FLAG_MODULE)
            rt_module_free((rt_module_t)thread->module_id, thread->stack_addr);
        else
#endif
        /* release thread's stack */
        rt_free(thread->stack_addr);
        /* delete thread object */
        rt_object_delete((rt_object_t)thread);
#endif

#ifdef RT_USING_MODULE
        if (module != RT_NULL)
        {   
            /* if sub thread list and main thread are all empty */
            if ((module->module_thread == RT_NULL) &&
                rt_list_isempty(&module->module_object[RT_Object_Class_Thread].object_list) )
            {
                module->nref --;
            }

            /* unload module */
            if (module->nref == 0)
                rt_module_unload(module);
        }
#endif
    }
}

上面蓝色的部分是出现问题的地方,对比汇编和c代码即可得到如下结果
r2=module->module_thread
r3=thread
根据异常信息
r02:0x800a41d8 r03:0xb5f3f5db
可知thread指针异常,0xb5f3f5db地址并不在内存中,不过又没有发现栈溢出,比较奇怪。


另外测试libc_ex2也是data about异常

finsh />libc_ex2()
mutex init:pmtx00
Execption:
r00:0x00000000 r01:0x600000d3 r02:0x00000000 r03:0xe75bd033
r04:0x8007713c r05:0x80076de8 r06:0x00000400 r07:0x00000000
r08:0x00000000 r09:0x80076de8 r10:0x800b57c4
fp :0x800b516c ip :0x00002009
sp :0x89f48104 lr :0x00401819 pc :0x8000a910
cpsr:0x60000013
data abort
thread - pth00 stack:
 thread  pri  status      sp     stack size max used   left tick  error
-------- ---- ------- ---------- ---------- ---------- ---------- ---
pth01    0xc0 ready   0x00000044 0x00000800 0x00000044 0x00000005 000
pth00    0xc0 ready   0x00000044 0x00000800 0x000006e8 0x00000005 000
tidle    0xff ready   0x00000084 0x00000100 0x000000a8 0x00000004 000
timer    0x08 suspend 0x0000007c 0x00000200 0x0000007c 0x00000009 000
tshell   0x14 suspend 0x000001d4 0x00001000 0x00000250 0x00000009 000
shutdown...
(0) assert failed at rt_hw_cpu_shutdown:189

通过上面的情况来看这个问题与pthread有关系,现在这个问题该如何继续查下去?

bernard

unread,
Sep 12, 2012, 5:04:51 AM9/12/12
to rt-threa...@googlegroups.com
是ARM9的?建议先把module关闭,然后测试下情况如何。

2012/9/12 罗辉 <luohu...@gmail.com>:

amsl

unread,
Sep 12, 2012, 5:04:45 AM9/12/12
to rt-thread-cnusers
pth00或pth01的stack size是不是设小了,加大试试。
 

 
 
发件人: 罗辉
发送时间: 2012-09-12 16:52
收件人: rt-thread-cnusers
主题: 运行libc测试程序data about异常问题

weety

unread,
Sep 12, 2012, 5:16:34 AM9/12/12
to rt-threa...@googlegroups.com
是ARM9的,刚刚测试关闭module后没有问题了,应该是与module有关系,这个地方可能是什么问题?

2012/9/12 bernard <bernar...@gmail.com>

Lin Shao

unread,
Sep 12, 2012, 5:27:55 AM9/12/12
to rt-threa...@googlegroups.com
如果是 module 问题,那我来看下吧。

2012/9/12 weety <luohu...@gmail.com>

bernard

unread,
Sep 12, 2012, 5:59:02 AM9/12/12
to rt-threa...@googlegroups.com
这个还不确定,因为module这部分主要在ART/RealTouch上跑,所以还不确定最近的一些改动是否会影响到ARM9。

如果使能了module,在不运行module的情况下应该也不会转入这部分代码。

是否module没初始化,或者bss段未初始化?貌似前一种可能大一些

2012/9/12 weety <luohu...@gmail.com>:

weety

unread,
Sep 12, 2012, 6:44:32 AM9/12/12
to rt-threa...@googlegroups.com
应该是调用了module初始化的,在系统启动时都会调用
rt_system_module_init()


2012/9/12 bernard <bernar...@gmail.com>
Reply all
Reply to author
Forward
0 new messages