我正在开发一个在基于 Linux 的小型 SBC(~32MB RAM)上运行的应用程序。可悲的是,我的应用程序最近变得太大而无法在 GDB 下运行。有谁知道我可以在嵌入式 Linux 中使用的任何好的、轻量级的调试方法?即使能够查看线程的堆栈跟踪也会非常有帮助。
我应该提到这个应用程序是用 C++ 编写的并且运行多个线程,所以 gdbserver 是不行的,因为它不适用于多线程应用程序。
提前致谢,
摩诃
我正在开发一个在基于 Linux 的小型 SBC(~32MB RAM)上运行的应用程序。可悲的是,我的应用程序最近变得太大而无法在 GDB 下运行。有谁知道我可以在嵌入式 Linux 中使用的任何好的、轻量级的调试方法?即使能够查看线程的堆栈跟踪也会非常有帮助。
我应该提到这个应用程序是用 C++ 编写的并且运行多个线程,所以 gdbserver 是不行的,因为它不适用于多线程应用程序。
提前致谢,
摩诃
gdbserver 绝对适用于多线程应用程序,我现在正在处理一个超过 25 个线程的嵌入式项目,我们一直在使用 gdbserver。
info threads
列出系统中的所有线程
thread <thread number from info threads>
切换到该执行线程。
thread apply XXX <command>
在XXX指定的线程上运行,也可以是'all'。所以如果你想要所有正在运行的线程的回溯
thread apply all bt
一旦您进入给定线程的执行流程,您所有的典型命令都会像在单线程进程中一样工作。
我听说有人在做一些黑客行为,比如在 QEMU 之类的模拟器中运行应用程序,然后在上面运行 GDB(或类似 valgrind 之类的东西)。这听起来很痛苦,但如果它有效......
你会使用 libunwind(获取堆栈跟踪)和 printf 风格的日志记录到任何地方吗?
串口打印是我能想到的最轻量级的~~~在Host PC中很容易看到,在你的app里简单轻量的代码~~
如果你没有串口,曾经我们使用了一个 GPIO 端口并使用它模拟了一个串口。它工作得很好,但有点慢:-( ~~~
您构建自己的调试器是否有原因?我正在使用 ARM 处理器 (AT91SAM926x) 开发 Linux 系统,我们同时使用 CodeSourcery 的编译器和调试器。我认为他们尚未发布带有 GDB 7 的版本,但我正在使用 gdbserver 工具调试多线程 C++ 应用程序,没有任何问题。
Gdbserver 确实适用于多线程应用程序。但是,您确实需要为您的主机编译一个跨目标调试器,以使其与您的目标 gdb 一起工作。
有关如何执行此操作的详细说明,请参阅本文: