5

我正在开发一个在基于 Linux 的小型 SBC(~32MB RAM)上运行的应用程序。可悲的是,我的应用程序最近变得太大而无法在 GDB 下运行。有谁知道我可以在嵌入式 Linux 中使用的任何好的、轻量级的调试方法?即使能够查看线程的堆栈跟踪也会非常有帮助。

我应该提到这个应用程序是用 C++ 编写的并且运行多个线程,所以 gdbserver 是不行的,因为它不适用于多线程应用程序。

提前致谢,

摩诃

4

5 回答 5

4

gdbserver 绝对适用于多线程应用程序,我现在正在处理一个超过 25 个线程的嵌入式项目,我们一直在使用 gdbserver。

info threads 

列出系统中的所有线程

thread <thread number from info threads>  

切换到该执行线程。

thread apply XXX <command>  

在XXX指定的线程上运行,也可以是'all'。所以如果你想要所有正在运行的线程的回溯

thread apply all bt

一旦您进入给定线程的执行流程,您所有的典型命令都会像在单线程进程中一样工作。

于 2009-12-03T00:21:24.027 回答
2

我听说有人在做一些黑客行为,比如在 QEMU 之类的模拟器中运行应用程序,然后在上面运行 GDB(或类似 valgrind 之类的东西)。这听起来很痛苦,但如果它有效......

你会使用 libunwind(获取堆栈跟踪)和 printf 风格的日志记录到任何地方吗?

于 2009-12-02T00:08:26.790 回答
1

串口打印是我能想到的最轻量级的~~~在Host PC中很容易看到,在你的app里简单轻量的代码~~

如果你没有串口,曾经我们使用了一个 GPIO 端口并使用它模拟了一个串口。它工作得很好,但有点慢:-( ~~~

于 2009-12-03T00:15:51.313 回答
0

您构建自己的调试器是否有原因?我正在使用 ARM 处理器 (AT91SAM926x) 开发 Linux 系统,我们同时使用 CodeSourcery 的编译器和调试器。我认为他们尚未发布带有 GDB 7 的版本,但我正在使用 gdbserver 工具调试多线程 C++ 应用程序,没有任何问题。

于 2009-12-07T20:56:08.970 回答
0

Gdbserver 确实适用于多线程应用程序。但是,您确实需要为您的主机编译一个跨目标调试器,以使其与您的目标 gdb 一起工作。

有关如何执行此操作的详细说明,请参阅本文:

使用 GDB 和 GDBserver 进行远程跨目标调试

于 2009-12-09T20:50:47.923 回答