我在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()
的行上进行调试时,调试器只是跳过了?
答案 0 :(得分:1)
当您编写“new”代码时,编译器会将其映射到“operator new”调用。这可能是以下几种情况之一,具体取决于您是分配数组,还是具有类特定运算符new的类,或两者兼而有之。对于new int(4)
,您正在致电:
:operator new(size_t)
该函数是C ++运行时库的一部分。如果感觉就好,它最终会调用malloc
。默认情况下,该库没有安装调试符号。如果你想调试它,你必须设置商店,好像你是库的开发人员:下载它的源代码,用符号编译它,并说服Eclipse使用你刚刚构建的版本。这是一项先进的技术。在尝试在这个社区中使用Eclipse之前,你最好真正理解make
和gdb
中真正发生了什么。
答案 1 :(得分:1)
回答你问题的一些要点。
(我在之后删除的评论中提供了一些内容。)
Eclipse不是一个调试器(或编译器),只是一个美化的编辑器(a.k.a。IDE)。你真的不需要它(我发现使用emacs
编辑器进行开发更方便;它实际上是一个观点和品味的问题)。它提供了gdb
GNU debugger的图形界面(您可以在终端中使用gdb
,以gdb -tui
开头)和编译器g++
(也许是通过运行make
)。您真的要step
逐步进入gdb
的代码。 Eclipse只为您提供了漂亮的按钮(但运行gdb
进程)。
您需要将step
中的符号和信息调试到某个函数中,以便代码应由GCC编译,编译器带有-g
标志。
您可能希望安装调试Debian或Ubuntu软件包libstdc++6-4.8-dbg
和libc6-dbg
,它们提供libstdc++
(g++-4.8
)和libc6
的调试符号和信息libstdc++6-4.8
您仍然需要轻松地将相应的libc6
和step
软件包的源代码真正地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)。