我在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之前,您最好真正了解make
和gdb
的真正发生了什么。
回答您问题的要点。
(我在一条评论中给出了其中一些,后来我删除了)
-
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-dbg
和libc6-dbg
,它们提供libstdc++
(用于g++-4.8
)和libc6
的调试符号和信息 -
您仍然需要轻松地将相应的
libstdc++6-4.8
和libc6
包的源代码转换为源代码中的step
-
您可能想要使用
gdb
的set debug-file-directory
命令(可能对/usr/lib/debug
);我不知道Eclipse是否在对接它。也许在终端中直接使用gdb
更容易。 -
你应该使用valgrind来查找内存泄漏。最近的GCC 4.8还为您提供了地址消毒剂(带有
-fsanitize=address
) -
最后,
::operator new
是C++中的一个内存管理原语;它通常调用malloc
(在libc6
中实现),后者最终使用linux内核提供的mmap(2)系统调用(或syscall)。