进入系统,CRTL功能与Eclipse在Linux中
step into system, CRTL functions with Eclipse in Linux
我是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。你最好学会用独立的工具(命令行)来做到这一点,比如emacs
或gedit
(作为编辑器),git
(版本控制),make
(构建器),运行gcc
或g++
编译器(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
标志赋给gcc
或g++
) -
使用gdb调试程序(使用
-g
编译) -
对于多文件c++程序,考虑学习如何使用make
-
使用git等版本控制系统
对于初学者,我建议避免使用Eclipse,因为它只是向您隐藏了下面真正发生的事情(Eclipse只是运行其他工具,如上述命令)
Linux下的软件开发需要与Windows下不同的心态:你实际上是在使用自己松散的独立工具组合,所以最好每个工具都学一点。
NB。要进入像malloc
这样的"系统"函数(它在mmap
这样的系统调用之上),您需要aptitude install libc6-dbg
的libc
包的调试变体,并且您需要将LD_LIBRARY_PATH
设置为/usr/lib/debug
等等。
- 如何从 Linux 控制台使用 CMake 构建 Eclipse C++ 项目(没有可用的 GUI)
- 如何在 Oracle Linux 上的 Eclipse 中编译和链接 boost 库
- C/C++:是否可以将 Eclipse 项目设置配置为接受 void 指针而不对所有 Linux 发行版进行强制转换
- C 类文件未在Linux OS上运行的Eclipse Mars中构建二进制文件
- Eclipse C++ Linux "to_string was not declared in this scope"
- Eclipse C 控制台打印订单Linux
- 代码在Eclipse中编译,而不是Linux上的G
- std::thread在Linux Eclipse上不起作用
- 使用 Linux Eclipse,我可以以编程方式判断我正在调试器 (gdb) 中执行
- 如何介入在Eclipse和Linux上实现new()的代码
- 当我可以从终端编译时,在Linux和Eclipse中编译
- 使用C++为科学linux安装Eclipse
- 如何在 Eclipse 中启动 gdb 调试之前运行 linux 脚本
- Eclipse CDT: From Windows to Linux
- Linux, Eclipse CDT run as su
- c++如果我的程序在eclipse上运行,它会在linux上运行吗
- 如何使用Eclipse从Windows调试linux C++程序
- c++ Eclipse (Linux-Mint12)中的强制转换问题
- 在eclipse中将.lib添加到.pro文件中.c++ / Eclipse / Linux
- 从Eclipse (Linux下)调试Python c++扩展