我们能否知道GDB中函数的定义?

时间:2017-09-26 09:17:38

标签: gdb pthreads

我正在学习gdb,让生活变得更轻松。我搜索谷歌这个但找不到答案。虽然我了解到$1是一个gdb变量,以后可以在调试的任何地方使用。但对于我的问题,没有信息。

代码:

if (pthread_create (&mythread[i], NULL, (void *)threadFunction,(void *) i))
{
   printf ("\nerror creating thread");
   exit (1);
}

我的问题是 - 我可以看到threadFunction或pthread_create函数的定义,假设gdb知道它。

1 个答案:

答案 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 glibcmusl-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 behaviorleaky abstractions

另请阅读Advanced Linux Programming(有点旧)和Operating Systems : Three Easy Pieces。两者都可以免费下载。 https://computing.llnl.gov/tutorials/pthreads/是关于Posix线程编程的一个很好的教程。