我是Visual C ++的高手,但是Linux开发对我来说是新的。 在Visual Studio中,很容易追踪由C运行时库实现的任何代码。 我只需要确保源安装,我可以进入任何function,我想 – malloc(),cout :: operator <<(),无论如何。
我正在尝试开发使用Eclipse的C ++包。 我怎样才能进入C运行时间例程呢? 由于Linux是开源的,我如何进入操作系统例程呢? 似乎应该可能 – 我是否缺lessdebugging信息,源代码或两者兼而有之? 东西在我的configuration?
目前我正在使用Ubuntu 12.10。 我正在使用g ++。 我相信我正在使用Eclipse构build系统,因为我从来没有导入过一个makefile项目; 我刚刚从Eclipse中的C ++项目向导开始了一个简单的“Hello World”项目。
在黑客攻击之后:
我已经安装了libstdc ++ 6-4.2-dbg包,认为它是libstdc库的debugging符号:
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,这表明我不明白C运行时库是如何在Linux中进行分解的。 libc,glib和libstdc ++有什么不同? 我需要哪些软件包?
如果我要求Eclipse打开printf.c文件(在〜/ eglibc-2.15 / stdio-common / printf.c中),它不会打开文件(不调整debugging窗口来显示源代码)并重新绘制显示关于无法find该文件的错误消息的窗口。 (在“printf.c”找不到源文件find该文件或编辑源查找path以包含其位置。)
同时,作为Linux上的内核开发人员,我同意分别使用单独的工具将是一件好事,因此Basile的答案是用得着的。
但是,在Eclipse中,进入C运行时库应该同样可行。 但是,仅仅因为操作系统是开源的,并不意味着它支持你在里面攀登 – 事实上,你不能从用户模式代码进入操作系统本身。 你需要加密数据库(谷歌它),你肯定需要第二台计算机附加到被调试的,因为当你进入内核,你将基本上锁定机器,至少在你正在步入的上下文,但是在从内核退出之前,很可能还会阻止其他工作的完成,例如,如果进入open()
,那么整个文件系统可能完全停止工作,直到您退出任何锁你持有。 这肯定会破坏一些软件。 请注意,这仅仅是调试内核时事情意外发生的一个例子,并不是严格意义上的“我已经完成了这个,而是发生了” – 我用调试器多次调试过内核,而且你必须小心这样做,而且你肯定不能在同一台机器上运行调试器,就像在你调试的时候机器停下来一样。
回到你可以通过Eclipse进行调试的用户模式,基本上所有你需要做的就是安装你感兴趣的运行时库的源代码,然后去…与Windows上使用Visual Studio的原理相同 – 除了几乎所有运行在Linux系统上的软件都可以作为源代码。 您可能需要使用调试符号重新编译一些库,就像在Windows中一样,您需要确保调试器知道如何找到源代码。 其他的一切都应该由Eclipse中的调试器来处理。 我花了大约三年的时间使用Eclipse进行本地和远程调试,总的来说,它可以工作。 有地方的怪癖,但几乎所有的调试器都是这种情况。
祝你好运。
首先,你不需要Eclipse来在Linux上开发软件。 你应该更好地学习如emacs
或gedit
(作为编辑器), git
(版本控制), make
(builder)等独立工具(命令行)来运行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
编译g++ -Wall -g source.cc -o progbin
并在你的终端输入./progbin
来运行它。 只有当程序被调试并且令人满意的时候,你才能用优化来编译它(通过给-O
或者-O2
标志给gcc
或者g++
)
使用gdb来调试程序(用-g
编译)。
对于多文件C ++程序,请考虑学习如何使用make
使用像git这样的版本控制系统
对于初学者来说,我建议避免使用Eclipse,因为它只是隐藏下面真正发生的事情(Eclipse只是简单地运行其他工具,比如上面的命令)
Linux下的软件开发需要与Windows下不同的思维方式:你真的在使用自己的松散的独立工具组合,所以更好地学习一点。
NB。 像malloc
(这是上面的系统调用,如mmap
)的“系统”功能,你需要libc
软件包的调试变种与aptitude install libc6-dbg
,你需要设置LD_LIBRARY_PATH
到/usr/lib/debug
等…