-1

我是 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,这表明我不了解 C 运行时库是如何在 Linux 中分解的。libc、glib 和 libstdc++ 有何不同?我需要哪些包?

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

4

2 回答 2

0

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

但是,使用 Eclipse 应该同样可以进入 C 运行时库。但是仅仅因为操作系统是开源的,并不意味着它支持你在里面随意攀爬——事实上,你不能从用户模式代码进入操作系统本身。您需要 KGDB(google it),并且您肯定需要第二台计算机连接到正在调试的计算机,因为当您进入内核时,您基本上会锁定机器,至少在您正在步进的上下文中,但很可能还会阻止其他工作完成,直到您从内核中退出,例如,如果您进入open(),在某些时候,整个文件系统很可能会完全停止工作,直到您退出所持有的任何锁为止。这肯定会扰乱一些软件。请注意,这只是调试内核时事情​​可能会意外工作的一个示例,而不是严格地说“我已经完成了这个并且它发生了” - 我已经使用调试器调试过几次内核,你必须小心你的做,你当然不能在同一台机器上运行调试器,因为机器在你调试时会停止。

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

祝你好运。

于 2012-12-25T10:54:27.607 回答
0

首先,您不需要 Eclipse 在 Linux 上开发软件。您应该更好地学习使用独立工具(命令行)来做到这一点,例如emacsor gedit(作为编辑器)、git(版本控制)、make(builder),它们运行gccorg++编译器(两者gcc&g++都是 GCC,Gnu Compiler Collection 的一部分)。

真的,通过不依赖 Eclipse,您将学到更多;它可能只是隐藏了你正在做这项工作的真正命令,你应该了解它们的真正含义。

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

并且操作系统正在提供系统调用(这是内核向应用程序提供的操作;从应用程序的角度来看,系统调用是原子的,因此您无法进入它;但是strace可能会向您显示某些执行完成的所有系统调用)。如果您想逐步进入系统库,例如libc您需要它的调试变体(例如某些libc6-dbg包)。但是通常不需要深入系统库。

请参阅http://advancedlinuxprogramming.com/

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

因此,终端内的分步说明:

  • 使用emacsgedit编辑源文件

  • 学习如何使用GCC:对于单一源 C++ 程序,编译它g++ -Wall -g source.cc -o progbin./progbin在终端中输入以运行它。只有当程序经过调试并且令人满意时,您才会使用优化对其进行编译(通过将-Oor-O2标志赋予gccor g++

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

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

  • 使用git 之类的版本控制系统

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

Linux 下的软件开发需要与 Windows 下不同的思维方式:您实际上是在使用自己的独立工具的松散组合,因此最好分别学习一下。

注意。要进入“系统”功能,例如malloc(在系统调用之上),您需要包mmap的调试变体,并且您需要设置为等...libcaptitude install libc6-dbgLD_LIBRARY_PATH/usr/lib/debug

于 2012-12-25T08:40:33.223 回答