在从旧的开发板迁移到新的开发板(带有ARM cortex A9的iMX6 sabre lite板)后,我正在尝试调试应用程序。我还在主机上运行gdb,在开发板上运行gdbserver,如__answer__section here how can i change the runtime libraries (libc ,ld, etc) used by gdb in cross (ARM) debugging中所述
在尝试运行应用程序并执行创建线程的步骤时,我得到了以下信息:
(gdb)
681 if (pthread_create(&serial_thread, &attr_detach, read_serial, argv[1]) != 0){
(gdb)
Cannot remove breakpoints because program is no longer writable.
Further execution is probably impossible.
0x00023308 in main (
argc=<error reading variable: Cannot access memory at address 0x7efffc8c>,
argv=<error reading variable: Cannot access memory at address 0x7efffc88>)
at main_process/main_process.c:681
681 if (pthread_create(&serial_thread, &attr_detach, read_serial, argv[1]) != 0){
warning: Error removing breakpoint 0
Cannot access memory at address 0x7efffc88
(gdb) info threads
Id Target Id Frame
* 1 Thread 2588.2588 0x00023308 in main (
argc=<error reading variable: Cannot access memory at address 0x7efffc8c>,
argv=<error reading variable: Cannot access memory at address 0x7efffc88>)
at main_process/main_process.c:681在那之后我就不能继续调试执行了。如果我简单地遍历代码(而不是单步执行),我将得到
(gdb) c
Continuing.
[Inferior 1 (process 2601) exited with code 0377]如果我在要创建的线程中添加一个断点,我会让执行在那里暂停,但之后继续执行是不可能的(它也不会退出)。
我了解到线程堆栈的大小可能很小,但它是8MB,并且我只将参数argv1传递给线程。
我使用Linaro gcc-linaro-arm-linux-gnueabi-2012.04-20120426_linux工具链来创建我的应用程序。并且在主板上运行的共享库(在调试时使用)属于LTIB_201204 rootfs。
谢谢你的帮助
发布于 2013-03-13 02:05:15
您是否可以首先检查板上是否存在libthread_db.so以及它是否未剥离(检查nm输出)?我从未亲自使用过LTIB,但从第2页可以看到这个Freescale application note
要正确捕获进程事件,如加载共享库或创建线程,实现这些通用功能的共享库必须部署在目标上,并且不能剥离符号。对于Linux用户空间,它们是ld.so、libthread_db.so、libpthread.so,对于i.MX/LTIB的特殊情况,可以在LTIB目标图像生成菜单上实现取消选中的条带选项。
https://stackoverflow.com/questions/15367815
复制相似问题