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

Posted

技术标签:

【中文标题】在 Linux 中使用 Eclipse 进入系统,CRTL 功能【英文标题】:step into system, CRTL functions with Eclipse in Linux 【发布时间】:2012-12-25 04:31:44 【问题描述】:

我是 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”中找不到源文件找到该文件或编辑源查找路径以包含其位置。)

【问题讨论】:

您使用的是哪个发行版? 你用的是什么编译器?这是回答这个问题的关键。 另外,你是如何在 Eclipse 中编译的?是导入的 make 项目,还是使用内部的 Eclipse 构建系统? 我已编辑问题以包含您要求的详细信息。 【参考方案1】:

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

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

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

祝你好运。

【讨论】:

确实,我无法从用户模式进入内核是有道理的。我同意——我可能需要找到运行时的源代码和符号。我在哪里可以找到它们以及如何安装它们?我必须自己构建它们来创建符号吗?如果是这样,怎么做?如何将 Eclipse 配置指向运行时源和符号以便它看到它们? 对,这本身可能就是一个全新的“问答”。我现在使用的任何机器上实际上都没有安装 Eclipse——我以前在以前的工作中使用过它,但那是在二月份。 askubuntu.com/questions/28372/… 给定库通常还有一个“dbg”包,因此您可以将其与二进制文件一起安装。但正如我所说,涵盖您需要了解的所有内容是一个相当大的主题...... 其实这只是这个问题的答案:“在Linux下使用Eclipse进行开发时,如何进入C Runtimes源码?”我知道软件包是用 apt-get 安装的,但我不知道要安装哪个软件包来获取符号和源代码,也不知道如何将它连接到 Eclipse。 “libstdc++6-4.2-dbg”可能是正确的包——或者只是正确的包之一——但我不知道它具体安装了什么或如何让 Eclipse 将它添加到它的源和符号路径.安装后,它在文件系统中的哪个位置? 对,所以您需要安装您要调试的任何库 - 因为我不知道您的代码是什么样的,所以我也不知道您可能正在使用哪些库.. . 但是如果你使用 C++,libstdc++ 似乎是一个好的开始。重建您的源代码,然后像单步执行您的函数一样单步执行该函数。 我正在尝试从标准 C 运行时进入例程:malloc()、strlen()、printf()。并且来自标准 C++ 运行时:cout::operator 【参考方案2】:

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

真的,不依赖 Eclipse 会学到很多东西;它可能只是隐藏了正在执行工作的真实命令,您应该了解它们的真正含义。

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

操作系统正在提供syscalls(这是内核提供给应用程序的操作;从应用程序的角度来看,系统调用是原子的,因此您无法进入它;但是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 下不同的思维方式:您实际上是在使用自己松散的独立工具组合,因此最好分别学习一下。

注意。要进入像malloc 这样的“系统”函数(在像mmap 这样的系统调用之上),您需要带有aptitude install libc6-dbglibc 包的调试变体,并且您需要将LD_LIBRARY_PATH 设置为/usr/lib/debug 等...

【讨论】:

不太清楚你为什么认为我是初学者。虽然我是 Linux 新手,但我对软件开发一点也不陌生。如果我使用 g++ 从命令行构建,然后使用 gdb 进行调试,我会发现 step 命令会像 Eclipse 一样跳过 RTL 函数。你的回答没有用。

以上是关于在 Linux 中使用 Eclipse 进入系统,CRTL 功能的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows中使用Eclipse访问虚拟机Linux系统中的hadoop

linux下集成开发环境之ECLIPSE--在线调试编译程序

idea在linux好用吗

在 Linux 系统上使用 Java / Eclipse TPTP 进行 16 线程 / 16 核心代码分析

windows eclipse c++怎么交叉编译linux

win系统下的eclipse连接和使用linux上的hadoop集群