生成线程后,gdb无法访问变量

时间:2013-03-12 17:17:39

标签: variables gdb pthreads gdbserver

我正在尝试调试应用程序,从旧的开发板迁移到新的开发板(带有ARM cortex A9的iMX6 saber lite板)。 我也在主机上运行gdb,在开发板上运行gdbserver,如__answer__section 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,我只是将一个参数argv [1](此时为空)传递给线程。

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

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

您是否可以首先检查主板上是否存在libthread_db.so并且是否已解除提取(请检查nm输出)?我从来没有亲自使用过LTIB,但从第2页开始Freescale application note

  

正确捕获加载共享库等过程事件   创建一个线程,实现这些共同的共享库   功能必须部署在目标未剥离的符号上。对于   Linux用户空间是ld.so,libthread_db.so,libpthread.so和   对于i.MX/LTIB的特殊情况,要实现取消检查条带   LTIB目标图像生成菜单上的选项。