如何介入在Linux上在Eclipse上实现new()的代码?

时间:2013-12-15 02:23:18

标签: c++ linux eclipse runtime malloc

我在Eclipse IDE中使用Ubuntu 13.10(GCC和g ++ 4.8.1)上的这个小型C ++程序:

#include <iostream>

int main() {
    int* a = new int(4);     //I want to see what happens here at a low-level
    std::cout << "!!!Hello World!!!" << std::endl;
    return 0;
}

我希望能够进入new()函数,然后在开始点击汇编代码之前尽可能地踩到它。我试图了解分配内存时会发生什么。

但是,现在当我调试项目并在包含new()的行上进行调试时,调试器只是跳过了?

编辑:我认为部分答案是我实际上必须安装我想介入的库?然后可能告诉Eclipse这些库? 这是对的吗?我该怎么做?

2 个答案:

答案 0 :(得分:1)

当您编写“new”代码时,编译器会将其映射到“operator new”调用。这可能是以下几种情况之一,具体取决于您是分配数组,还是具有类特定运算符new的类,或两者兼而有之。对于new int(4),您正在致电:

:operator new(size_t)

该函数是C ++运行时库的一部分。如果感觉就好,它最终会调用malloc。默认情况下,该库没有安装调试符号。如果你想调试它,你必须设置商店,好像你是库的开发人员:下载它的源代码,用符号编译它,并说服Eclipse使用你刚刚构建的版本。这是一项先进的技术。在尝试在这个社区中使用Eclipse之前,你最好真正理解makegdb真正发生了什么。

答案 1 :(得分:1)

回答你问题的一些要点。

(我在之后删除的评论中提供了一些内容。)

  • Eclipse不是一个调试器(或编译器),只是一个美化的编辑器(a.k.a。IDE)。你真的不需要它(我发现使用emacs编辑器进行开发更方便;它实际上是一个观点和品味的问题)。它提供了gdb GNU debugger的图形界面(您可以在终端中使用gdb,以gdb -tui开头)和编译器g++(也许是通过运行make)。您真的要step逐步进入gdb的代码。 Eclipse只为您提供了漂亮的按钮(但运行gdb进程)。

  • 您需要将step中的符号和信息调试到某个函数中,以便代码应由GCC编译,编译器带有-g标志。

  • 您可以使用调试符号编译GNU libc库Glibclibstdc++(由您的GCC编译器版本提供)...

  • 您可能希望安装调试Debian或Ubuntu软件包libstdc++6-4.8-dbglibc6-dbg,它们提供libstdc++g++-4.8)和libc6的调试符号和信息libstdc++6-4.8

  • 您仍然需要轻松地将相应的libc6step软件包的源代码真正地set debug-file-directory放入其源代码中

  • 您可能希望使用/usr/lib/debug的{​​{1}}命令(可能是gdb);我不知道Eclipse是否正在连接它。也许直接在终端中使用gdb更容易。

  • 您应该使用valgrind来捕获内存泄漏。最近的GCC 4.8还为您提供了地址清理程序(使用-fsanitize=address

  • 最后,::operator new是C ++中的memory management原语;它通常会调用malloc(在libc6中实现),最终使用mmap(2)原子提供的syscall系统调用(或linux kernel)。