2

在从旧开发板迁移到新开发板(带有 ARM cortex A9 的 iMX6 saber lite 板)后,我正在尝试调试应用程序。我还在主机上运行 gdb 并在开发板上运行 gdbserver,如 __answer__ 部分中所述,如何更改 gdb 在交叉(ARM)调试中使用的运行时库(libc、ld 等)

在尝试运行应用程序并执行创建线程的步骤时,我得到了这个:

(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,我只是将参数 argv[1](目前为空)传递给线程。

我使用 Linaro gcc-linaro-arm-linux-gnueabi-2012.04-20120426_linux 工具链来创建我的应用程序。并且在板上运行(并在调试时使用)的共享库属于 LTIB_201204 rootfs。

感谢您的帮助

4

1 回答 1

2

您可以先检查libthread_db.so板上是否存在并且未剥离(检查nm输出)吗?我个人从未使用过 LTIB,但从第 2 页开始,此飞思卡尔应用说明

为了正确捕获诸如加载共享库或创建线程之类的进程事件,实现这些通用功能的共享库必须部署在未剥离符号的目标上。对于 Linux 用户空间,它们是 ld.so、libthread_db.so、libpthread.so,对于 i.MX/LTIB 的特殊情况,可以在 LTIB Target Image Generation 菜单上取消选中剥离选项。

于 2013-03-12T18:05:14.577 回答