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



我在Ubuntu 13.10(GCC和g++4.8.1)上的Eclipse IDE中有一个很小的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这些库有人这样说对吗?我该怎么做

当代码显示"new"时,编译器会将其映射为对"operator new"的调用。这可能是多种情况之一,具体取决于您是分配数组,还是分配具有类特定运算符new的类,或者两者兼有。对于new int(4),您正在调用:

:operator new(size_t)

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

回答您问题的要点。

(我在一条评论中给出了其中一些,后来我删除了)

  • Eclipse不是调试器(或编译器),只是一个荣耀的编辑器(又称IDE)。您并不真的需要它(我发现使用emacs编辑器进行开发更方便;这实际上是一个意见和品味的问题)。它为gdb(GNU调试器)(您可以在终端中使用gdb,将其作为gdb -tui启动)和编译器g++(可能通过运行make)提供了一个图形界面。实际上,您正在使用gdb一步一步地执行step。Eclipse只是为您提供了好看的按钮(但运行的是gdb进程)。

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

  • 您可以轻松编译GNU libc库Glibc,以及带有调试符号的libstdc++(由您的GCC编译器版本提供)。。。

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

  • 您仍然需要轻松地将相应的libstdc++6-4.8libc6包的源代码转换为源代码中的step

  • 您可能想要使用gdbset debug-file-directory命令(可能对/usr/lib/debug);我不知道Eclipse是否在对接它。也许在终端中直接使用gdb更容易。

  • 你应该使用valgrind来查找内存泄漏。最近的GCC 4.8还为您提供了地址消毒剂(带有-fsanitize=address

  • 最后,::operator new是C++中的一个内存管理原语;它通常调用malloc(在libc6中实现),后者最终使用linux内核提供的mmap(2)系统调用(或syscall)。

相关内容

  • 没有找到相关文章

最新更新