我正在尝试在我的Ubuntu笔记本电脑上调试为Raspberry Pi编写的代码。我正在使用:
git clone git://github.com/raspberrypi/tools.git
获得的Raspberry Pi工具链和(部分?)根fs
以下测试用例:
#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调用,所以调试主线程工作,但是:
因此gdb无法在此配置/设置中调试多线程程序?!我错过了什么?
我在OSX机器上的Parallels虚拟机中运行Ubuntu的事实可能与它有关吗?我没有专门的Ubuntu机器进行测试,但我对此表示怀疑。
更新:在本机Fedora系统上,行为更糟糕:断点也没有被采用,但它也在puts
和pthread_join
崩溃。
提前致谢