进入系统,CRTL功能与Eclipse在Linux中

step into system, CRTL functions with Eclipse in Linux

本文关键字:Eclipse Linux 功能 系统 CRTL      更新时间:2023-10-16

我是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的源代码安装到我的home目录下:

apt-get source libc6
在这一点上,尝试进入printf()告诉我printf.c缺失。我不能进入malloc或strlen,这表明我不理解如何在Linux中分解C运行时库。libc、glib和libstdc++有什么不同?我需要哪些包裹?

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

同时,作为Linux上的内核开发人员,我同意单独使用单个工具将是一件值得学习的好事,因此Basile的答案是usefuel。

但是,使用Eclipse也同样可以进入C运行时库。但是仅仅因为操作系统是开源的并不意味着它支持你随意地在里面爬来爬去——事实上,你不能从用户模式代码进入操作系统本身。你娘家姓的KGDB(谷歌),你需要第二个电脑连接到一个正在调试,因为当你进入内核,你会锁住机器,至少在你走,但也最有可能阻止其他工作做直到你回来从内核,举个例子,如果你进入open(),整个文件系统很可能在某种程度上完全停止工作直到你退出你的锁。这肯定会扰乱一些软件。请注意,这只是一个例子,说明在调试内核时,事情可能会出乎意料地工作,而不是严格地"我已经这样做了,它发生了"——我已经用调试器调试过几次内核,你必须小心你所做的事情,你当然不能在同一台机器上运行调试器,因为当你调试时,机器会停止。

回到用户模式,你可以通过Eclipse调试,基本上你所需要做的就是安装你感兴趣的运行时库的源代码,然后继续…与visual studio在Windows上的原理相同——除了在Linux系统上运行的几乎所有软件都可以作为源代码获得。您可能需要用调试符号重新编译一些库,就像在Windows中一样,您需要确保调试器知道如何找到源代码。其他一切都应该由Eclipse中的调试器处理。我花了大约三年的时间使用Eclipse进行本地和远程调试,总的来说,它可以工作。有些地方会有怪癖,但几乎所有调试器都是如此。

好运。

首先,在Linux上开发软件不需要Eclipse。你最好学会用独立的工具(命令行)来做到这一点,比如emacsgedit(作为编辑器),git(版本控制),make(构建器),运行gccg++编译器(gcc &g++是GCC (Gnu编译器集合)的一部分。

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

您希望将-g -Wall选项传递给GCC。-g选项要求调试信息,而-Wall选项要求几乎所有的警告。改进你的代码,直到没有警告。

操作系统提供了系统调用(由内核提供给应用程序的操作);从应用程序的角度来看,系统调用是原子的,因此您无法进入它;然而,strace可能会显示某些执行所完成的所有系统调用)。如果你想一步一步地进入像libc这样的系统库,你需要它的调试变体(例如一些libc6-dbg包)。但是通常不需要深入研究系统库。

见http://advancedlinuxprogramming.com/

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

那么,终端内的一步一步指令:

  • 使用emacs或gedit编辑源文件

  • 学习如何使用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这样的系统调用之上),您需要aptitude install libc6-dbglibc包的调试变体,并且您需要将LD_LIBRARY_PATH设置为/usr/lib/debug等等。