2015-04-29 66 views
10

如何在gdb中包含/查看malloc的源代码?在gdb中包含malloc.c的源代码?

我想在gdb中执行一步一步的执行,并在任何malloc函数被调用时步入malloc.c源代码。

目前GDB什么说的是:这里 malloc.c: No such file or directory.

This人面临同样的问题,但他们不提一个解决方案,即如何真正步入的malloc的源代码。

我在Ubuntu server 14.04,我已经尝试安装以下软件: libc6-dbglibc6-devlibc6-dbgsym。 我甚至不知道,如果这些软件,可以帮助,但在安装libc-dbgsym给了我以下错误:

dpkg: error processing archive /var/cache/apt/archives/libc6-dbgsym_2.19-0ubuntu6.6_amd64.ddeb (--unpack): trying to overwrite 
    '/usr/lib/debug/usr/lib/x86_64-linux-gnu/audit/sotruss-lib.so', which 
    is also in package libc6-dbg:amd64 2.19-0ubuntu6.6 dpkg-deb: error: 
    subprocess paste was killed by signal (Broken pipe) 
+0

你需要找到,或编译一个库的调试版本。 –

+0

@MartinJames这是我失败的部分! :( – Paschalis

回答

11

以下为我工作。不确定是否有更好的方法。

  1. 安装的libc6-DBG(你已经这样做): sudo apt-get install libc6-dbg
  2. 安装eglibc源包(Ubuntu的实际使用eglibc):sudo apt-get install eglibc-source
  3. 解包安装在/ usr/src目录/ glibc的tar文件:/usr/src/glibc $ sudo tar xvf eglibc-2.19.tar.xz
  4. 杀青GDB和路径添加到的malloc来源:(gdb) dir /usr/src/glibc/eglibc-2.19/malloc

(gdb) n

13 char *c = malloc(100);

(gdb) s

__GI___libc_malloc (bytes=100) at malloc.c:2876 2876

{

(gdb)

+0

工程就像魅力!另外,可以在'.gdbinit'中添加步骤4! – Paschalis

+1

太棒了!一个有点相关的陷阱(这听起来像你知道的)。但是对于未来的读者:不要因为libc做各种符号体操,所以'malloc'符号不是被调用的实际'malloc',所以不要中断'malloc'本身。相反,打入调用者并进入'malloc'调用。 – kaylum

3

GDB只能显示源代码,因为调试编译的二进制文件包含二进制之间的引用代码和源文件。

malloc()位于C库中。在普通系统上,它不是用调试元数据编译的,它的源代码也没有安装在系统中。

但它们可以连接,您只需要安装这些库的调试版本。例如,在debian上,一个apt-get install glibc-debug或类似的程序就可以完成。在SuSE上,一个zipper in libc6-debug(afaik,也许确切的软件包名称可能有点不同)。

+0

我应该低估只是因为你说“gdb不是一个向导”! – Paschalis

+0

笑话不谈,我想我是这么做的,我在Ubuntu上,我相信'libc6-dbg'就等同于你的建议! – Paschalis

+0

@Paschalis对不起,我没有任何负面的意图,我从答案中删除了这个。 – peterh