Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Eclipse和Linux上编写实现new()的代码? 我在Eclipse IDE上有这个小型C++程序,在Ubuntu 13.10(GCC和G+4.4.1): #包括 int main(){ int*a=newint(4);//我想看看这里在低级别发生了什么 std::cout_C++_Linux_Eclipse_Runtime_Malloc - Fatal编程技术网

如何在Eclipse和Linux上编写实现new()的代码? 我在Eclipse IDE上有这个小型C++程序,在Ubuntu 13.10(GCC和G+4.4.1): #包括 int main(){ int*a=newint(4);//我想看看这里在低级别发生了什么 std::cout

如何在Eclipse和Linux上编写实现new()的代码? 我在Eclipse IDE上有这个小型C++程序,在Ubuntu 13.10(GCC和G+4.4.1): #包括 int main(){ int*a=newint(4);//我想看看这里在低级别发生了什么 std::cout,c++,linux,eclipse,runtime,malloc,C++,Linux,Eclipse,Runtime,Malloc,当您编写的代码显示“new”时,编译器会将其映射到对“operator new”的调用。这可以是几件事之一,具体取决于您是分配数组还是分配具有类特定运算符new的类,或者两者都是。对于new int(4),您正在调用: :新操作员(尺寸) 函数是C++运行时库的一部分。如果它感觉像它,它最终会转到调用 MalOC > > >代码>::运算符new < /C>是C++中的一个原语;它通常调用 MalOC (在 LBC6中实现),它最终使用由.< /P>原子化提供的系统调用(或)。 使用指令步进模

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

:新操作员(尺寸)


函数是C++运行时库的一部分。如果它感觉像它,它最终会转到调用<代码> MalOC make

gdb
的实际情况。

回答您的问题的要点

(我在一篇评论中给出了其中的一些,之后我将其删除)

  • Eclipse不是调试器(或编译器),只是一个美化的编辑器(又称编辑器)。您并不真正需要它(我发现使用
    emacs
    编辑器进行开发更方便;这实际上是一个观点和品味的问题)。它为
    gdb
    提供了一个图形界面(您可以在终端中使用
    gdb
    ,将其启动为
    gdb-tui
    )并将其加载到您的编译器
    g++
    (可能通过运行
    make
    )中。您真的需要
    一步一步地使用
    gdb
    编写代码。Eclipse为您提供了漂亮的按钮(但运行了
    gdb
    过程)

  • 您需要调试符号和信息,以便
    步骤
    转换为某些函数,以便GCC应使用编译器的
    -g
    标志来编译代码

  • 您可以轻松地编译GNULIBC库和带有调试符号的
    libstdc++
    (由您的编译器版本提供)

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

  • 您仍然需要将相应的
    libstdc++6-4.8
    libc6
    包的源代码轻松地放入它们的源代码中

  • 您可能想使用
    gdb
    set debug file directory
    命令(可能是
    /usr/lib/debug
    );我不知道Eclipse是否与之连接。可能直接在终端中使用
    gdb
    更容易

  • 您应该使用来查找内存泄漏。Recent还为您提供了地址消毒剂(带有
    -fsanize=address

  • < > > > >代码>::运算符new < /C>是C++中的一个原语;它通常调用<代码> MalOC (在 LBC6</代码>中实现),它最终使用由.< /P>原子化提供的系统调用(或)。
使用指令步进模式(请参阅)@Samuel_xL不是重复的-我不想看到汇编指令。我想看看malloc()到底做了什么(但在C级)你做不到。没有符号和源代码;你所能做的就是在汇编级观看它。因此,无法“介入”malloc的Linux实现()从Eclipse内部?!@user997112您将无法,“介入”正是程序集代码。但关于重复,您是对的:我读的是“我想看程序集代码”,而不是“在我开始点击程序集代码之前”,什么是“符号”?我认为最简单的方法是下载运行时源文件,然后只使用一个程序,该程序允许我对每个函数定义按ctrl+f键?不。您仍然无法单步执行。您可以读取代码,但如果没有调试符号,调试器无法将机器代码与源代码关联。
#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;
}