进入系统,CRTL在Linux中与Eclipse一起运行

时间:2012-12-25 04:31:44

标签: c++ linux eclipse

我是Visual C ++的高手,但Linux开发对我来说是新的。在Visual Studio中,可以轻松跟踪C运行时库实现的任何代码。我只需要确保安装源代码,然后我就可以直接进入我想要的任何函数 - malloc(),cout :: operator<<(),无论如何。

我正在尝试使用Eclipse的C ++包进行开发。我怎样才能进入C运行时例程呢?由于Linux是开源的,我如何进入操作系统例程?似乎应该可能 - 我是否缺少调试信息,源代码或两者兼而有之?我的配置中有什么东西?

我现在正在使用Ubuntu 12.10。我正在使用g ++。我相信我正在使用Eclipse构建系统,因为我从未导入过makefile项目;我刚开始使用Eclipse中的C ++项目向导中的一个简单的“Hello World”项目。

对此进行了一次黑客攻击:

我已经安装了libstdc ++ 6-4.2-dbg包,认为它是libstdc库的调试符号:

sudo apt-get install libstdc++6-4.2-dbg

我还安装了dpkg-dev,因为下一步说我需要它:

sudo apt-get install dpkg-dev

我尝试将libc6源安装到我家的目录中:

apt-get source libc6

此时,尝试进入printf()告诉我缺少printf.c。我无法进入malloc或strlen,这表明我不明白如何在Linux中考虑C运行时库。 libc,glib和libstdc ++有何不同?我需要哪些包裹?

如果我要求Eclipse打开我所拥有的printf.c文件(在〜/ eglibc-2.15 / stdio-common / printf.c),它不会打开文件(不调整调试窗口到显示源代码并重新绘制窗口,显示有关无法找到文件的错误消息。 (无法在“printf.c”中找到源文件。找到该文件或编辑源查找路径以包含其位置。)

2 个答案:

答案 0 :(得分:1)

虽然作为Linux上的内核开发人员,我确实同意单独使用各个工具将是一件好事,因此Basile的答案是usefuel。

但是,使用Eclipse同样可以进入C运行时库。但是,仅仅因为操作系统是开放源代码并不意味着它支持你在内部爬行它 - 实际上,你不能从用户模式代码进入操作系统本身。你需要KGDB(谷歌),你肯定需要第二台计算机连接到正在调试的计算机,因为当你进入内核时,你将基本上锁定机器,至少在你踩踏的环境中,但是很可能还会阻止其他工作在你从内核退出之前完成,所以例如,如果你进入open(),在某些时候整个文件系统可能会完全停止工作,直到你退出无论你持有什么锁。这肯定会打乱一些软件。请注意,这只是一个示例,说明在调试内核时事情​​可能会如何工作,而不是严格“我已经完成了这件事并且它发生了” - 我已经多次使用调试器调试内核,你必须小心你的内容你当然不能在同一台机器上运行调试器,因为你在调试时机器STOPS。

回到你可以通过Eclipse调试的用户模式,基本上你需要做的就是安装你感兴趣的运行时库的源代码,然后去...与Windows上的视觉工作室原理相同 - 除了您在Linux系统上运行的几乎所有软件都可用作源代码。您可能需要使用调试符号重新编译某些库,就像在Windows中一样,您需要确保调试器知道如何查找源代码。其他所有内容都应由Eclipse中的调试器处理。我花了大约三年时间使用Eclipse进行本地和远程调试,总的来说,它可以工作。在某些地方存在怪癖,但几乎所有调试器都是这种情况。

祝你好运。

答案 1 :(得分:0)

首先,您不需要Eclipse在Linux上开发软件。您应该更好地学习使用独立工具(命令行),如emacsgedit(作为编辑器),git(版本控制),make(构建器)运行gccg++编译器(gccg++都是GCC(Gnu编译器集合)的一部分。

真的,你不会依赖Eclipse学到更多东西;它可能只是隐藏了正在执行工作的真正命令,你应该了解它们到底是什么。

您想将-g -Wall options传递给GCC。 -g选项要求提供调试信息,-Wall选项会询问几乎所有警告。改进您的代码,直到没有给出警告。

操作系统正在提供syscalls(内核为应用程序提供的操作;从应用程序的角度来看,系统调用是原子的,所以你无法进入它;但是strace可能向你展示一些执行完成的所有系统调用。如果你想在libc之类的系统库中一步一步,你需要它的调试变体(例如一些libc6-dbg包)。但通常没有必要深入系统库。

请参阅http://advancedlinuxprogramming.com/

然后,您将使用gdb来调试二进制程序。

所以,终端内的分步说明:

  • 使用emacsgedit

  • 编辑您的源文件
  • 了解如何使用GCC:对于单个源C ++程序,使用g++ -Wall -g source.cc -o progbin对其进行编译,并在终端中键入./progbin以运行它。只有当程序被调试并且令人满意时才会通过优化来编译它(通过将-O-O2标志赋予gccg++

  • 使用gdb调试程序(使用-g编译)。

  • 对于多文件C ++程序,请考虑学习如何使用make

  • 使用版本控制系统,如git

对于初学者,我建议避免使用Eclipse,因为它只是隐藏了下面真正发生的事情(Eclipse只是运行其他工具,如上面的命令)

Linux下的软件开发需要与Windows不同的思维方式:您确实使用自己独立工具的松散组合,因此最好先了解一下这些工具。

NB。要进入像malloc这样的“系统”函数(在mmap之类的系统调用之上),你需要使用libc aptitude install libc6-dbg包的调试版本,你需要设置LD_LIBRARY_PATH/usr/lib/debug等......