小编Mr *_*nky的帖子

我需要什么来调试pthreads?

我想在我的自定义Linux发行版上调试pthreads,但我遗漏了一些东西.我的主机是Ubuntu 12.04,我的目标是使用crosstool-NG交叉编译工具集构建的i486自定义嵌入式Linux,其余的操作系统是用Buildroot制作的.

我会列出事实:

  • 我可以在目标上运行多线程应用程序

  • 当我在目标上运行多线程应用程序时,Google Breakpad无法创建崩溃报告.当我在主机上运行时,具有完全相同构建的Breakpad库的完全相同的应用程序将成功.

  • GDB无法调试目标上的多线程应用程序.

例如

$./gdb -n -ex "thread apply all backtrace" ./a.out --pid 716

dlopen failed on 'libthread_db.so.1' - /lib/libthread_db.so.1: undefined symbol: ps_lgetfpregs
GDB will not be able to debug pthreads.
GNU gdb 6.8
Run Code Online (Sandbox Code Playgroud)

我不认为ps_lgetfpregs是一个问题因为这个.

  • 我的crosstool构建创建了libthread_db.so文件,并将其放在目标上.

  • 我的crosstool构建为我的目标创建了gdb,因此它应该与我在目标上运行的相同库链接.

  • 如果我在我的主机上运行gdb,对我的测试应用程序,我得到每个正在运行的线程的回溯.

我怀疑Breakpad的问题与GDB的问题有关,但我无法证实这一点.唯一的共同点是缺少多线程调试.

我的主机和目标之间存在一些重要的区别,使我无法在目标上调试pthread.

有谁知道它是什么?

编辑:

来自TI的Denys Dmytriyenko说:

通常,GDB不是很挑剔,你可以混合和匹配不同版本的gdb和gdbserver.但是,遗憾的是,如果您需要调试多线程应用程序,那么特定API有一些依赖性......

例如,如果您没有为线程支持正确构建GDB,那么这是您可能会看到的消息之一:

dlopen在'libthread_db.so.1'上失败 - /lib/libthread_db.so.1:未定义的符号:ps_lgetfpregs GDB将无法调试pthread.

请注意,此错误与我获得的错误相同,但他没有详细介绍如何"正确"构建GDB.

GDB FAQ说:

(Q)除了发生崩溃的线程之外,GDB没有看到任何线程; 或者,当我设置断点时,SIGTRAP会终止我的程序.

(A)这经常发生在Linux上,特别是在嵌入式目标上.有两个常见原因:

  • 你正在使用glibc,你已经剥离了libpthread.so.0

  • libpthread.so.0和libthread_db.so.1之间不匹配

GDB本身不知道如何解码由glibc维护的"线程控制块",并认为是glibc私有实现细节.它使用libthread_db.so.1(glibc的一部分)来帮助它这样做.因此,libthread_db.so.1和libpthread.so.0必须在版本和编译标志中匹配.此外,libthread_db.so.1要求libpthread.so.0中存在某些非全局符号.

解决方案:使用strip --strip-debug libpthread.so.0而不是strip libpthread.so.0.

我尝试了一个非剥离的libpthread.so.0,但它并没有什么区别.我将调查pthread和thread_db之间的任何不匹配.

linux embedded cross-platform pthreads cross-compiling

8
推荐指数
1
解决办法
5331
查看次数

什么是"struct file_operations"参数?

我正在实现一个Linux字符设备驱动程序.

linux/fs.h头文件列出了没有参数名称的file_operations.

例如

struct file_operations {
    struct module *owner;
    loff_t (*llseek) (struct file *, loff_t, int);
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
    ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
    ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
    int (*readdir) (struct file *, void *, filldir_t);
    unsigned int (*poll) (struct file *, struct poll_table_struct *); …
Run Code Online (Sandbox Code Playgroud)

linux driver linux-device-driver linux-kernel

7
推荐指数
1
解决办法
2万
查看次数

是否有像管道一样工作的C++ STL类?

在抽象术语中,管道是具有破坏性读取的流/ FIFO样式容器.它有一个read()方法可以同时复制数据块,get并且put对单个字节起作用.当read或者get返回时,从管道的内部缓冲区中删除从管道中复制的数据 - 与文件或任何其他容器类型不同.

大多数(全部?)STL容器不提供类似于read()缓冲区命令.是否有带pop_many()成员的fifo容器类型?

stringstream是我能想到的最接近的东西,因为它维护一个内部读指针,未来的读取将阻塞,直到流再次填满.从API的角度来看,容器是空的,但消耗的数据必须手动进行垃圾收集.

在C++中是否有一个等效的容器或流类来执行此操作,或者它是一个自己滚动的问题(如在stringstream示例中)?

c++ stl

6
推荐指数
1
解决办法
1706
查看次数

如何在Eclipse Juno中打开串口终端?

在以前的Eclipse版本中,我已经能够打开一个呈现串行终端/控制台的视图.

我如何在Eclipse Juno中执行此操作?

我打开了一个"终端"视图,它的文字说明:

To open a terminal, right-click the Terminal subsystem under the target. Then select 'Launch Terminal' from the context menu.

我真的不知道这是在说什么,我已经使用Eclipse好几年了!

有人可以对此有所了解吗?

编辑: 我发现"目标下的终端子系统",指的是"远程系统"视图.我找不到串行终端的任何选项.

eclipse-juno

3
推荐指数
1
解决办法
1万
查看次数