如何调试在qemu

时间:2015-08-05 12:24:40

标签: c multithreading gdb raspberry-pi qemu

我正在尝试在我的Ubuntu笔记本电脑上调试为Raspberry Pi编写的代码。我正在使用:

  • 在〜/ rpi
  • 中执行的git clone git://github.com/raspberrypi/tools.git获得的Raspberry Pi工具链和(部分?)根fs
  • 从Ubuntu repositiories安装的qemu虚拟器 - qemu-arm报告 版本2.0.0
  • 以下测试用例:

    #include <pthread.h>
    #include <stdio.h>
    
    static void *thread(void *arg)
    {
       static char szReturn[] = "Me too";
    
       puts((char *)arg);
       puts("Hello, I'm Thread");
       return szReturn;
    }
    
    int main(int argc, char *argv[])
    {
       pthread_t tid;
       char szGreeting[] = "Hello, I'm Main", *reply;
    
       if (pthread_create(&tid, NULL, &thread, szGreeting) != 0)
       {
            perror("pthread_create says: ");
            return 1;
       }
       puts("Nice to meet you");
       if (pthread_join(tid, (void **)&reply) == 0)
            puts(reply);
    
       return 0;
    }
    

~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin添加到PATH(我使用64位Ubuntu)后,我(从测试代码所在的目录):

  • arm-linux-gnueabihf-gcc -g -O0 test.c -o test -lpthread
  • qemu-arm -L ~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc ./test

我得到了预期的输出,因此线程的创建和执行都有效。

但是,如果我这样做:

  • qemu-arm -g 1234 -L ~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc ./test在一个终端中,启动qemu并让它等待调试器连接到它
  • arm-linux-gnueabihf-gdb -ex="target remote localhost:1234" -x="set breakpoint pending on" -ex="break main" ./test在另一个终端中,用gdb
  • 开始调试程序

我进入gdb后继续&#39;我到达main,我设置断点到线程,21和24,我接下来OK到ptread_create调用,所以调试主线程工作,但是:

  • 当它执行pthread_create时,不是点击3个断点中的一个(线程,创建失败或创建成功案例),而是gdb报告&#34;劣等终止&#39;会议结束
  • 回到qemu终端,程序已生成正常输出,因此创建并执行了线程,整个程序按预期工作

因此gdb无法在此配置/设置中调试多线程程序?!我错过了什么?

我在OSX机器上的Parallels虚拟机中运行Ubuntu的事实可能与它有关吗?我没有专门的Ubuntu机器进行测试,但我对此表示怀疑。

更新:在本机Fedora系统上,行为更糟糕:断点也没有被采用,但它也在putspthread_join崩溃。

提前致谢

0 个答案:

没有答案