我正在学习gdb,让生活变得更轻松。我搜索谷歌这个但找不到答案。虽然我了解到$1
是一个gdb变量,以后可以在调试的任何地方使用。但对于我的问题,没有信息。
代码:
if (pthread_create (&mythread[i], NULL, (void *)threadFunction,(void *) i))
{
printf ("\nerror creating thread");
exit (1);
}
我的问题是 - 我可以看到threadFunction或pthread_create函数的定义,假设gdb知道它。
答案 0 :(得分:1)
GDB使用调试信息,通常采用DWARF格式,其中包含名称-e.g.局部变量,源位置(源路径,行号)等....对于使用-g
编译的代码存在调试信息(传递给GCC编译器)。因此,您可以获取使用-g
编译的每个代码的源位置信息(并且您可以使用-g
正在使用的库重新编译自己)。大多数情况下,DWARF信息位于同一个共享库或目标文件中(采用ELF格式),但有一些方法可以将其保存在单独的文件中。
pthread_create
是一个C标准库POSIX函数(它使用system calls,例如clone(2);有关详尽列表,请参阅syscalls(2)。仔细阅读pthread_create(3)文档。在Linux上,大多数C standard libraries(特别是GNU glibc和musl-libc)都是free software,因此您可以研究他们的源代码。您可能需要找到libc的调试变体,例如一些libc-dbg
Debian软件包。
我可以看到
的定义threadFunction
您可以使用GDB的list
command。所以请尝试list threadFunction
(假设包含其定义的源代码是使用-g
编译的)。
...或
pthread_create
pthread_create
(由您的C标准库提供)的定义仅在您使用使用调试信息编译的libc时才会出现。浏览其源代码可能会更快(例如src/thread/pthread_create.c
musl-libc)而不是使用调试信息重新编译整个libc
。
要了解pthread_create
的行为,您可能需要了解clone(2),但最好相信pthread_create(3)中的文档。其中大部分(clone
)是在Linux内核内部实现的,它也是免费软件(可在kernel.org下载)。您可能需要花费很多年时间来了解所有细节(但在开始研究一些内核代码之后也请kernelnewbies.org)。
许多Linux发行版主要由自由软件组成,总计超过十亿行源代码。你肯定需要超过一生的时间来研究它们中的大多数。 Abstraction在软件开发中几乎必不可少(因此请选择您愿意忘记的详细信息)。另请阅读undefined behavior和leaky abstractions。
另请阅读Advanced Linux Programming(有点旧)和Operating Systems : Three Easy Pieces。两者都可以免费下载。 https://computing.llnl.gov/tutorials/pthreads/是关于Posix线程编程的一个很好的教程。