“在使用gdb在Eclipse中调试简单C ++时,没有可用于main()的源代码”错误

时间:2010-02-24 08:33:57

标签: c++ eclipse debugging macos gdb

我在OSX上调试Eclipse中的C ++程序(Helios的最新RC,用自己内部更新的最新CDT)时遇到了麻烦。

该程序非常简单(基本上是NeHe OpenGL教程的第2课),由一个cpp文件组成,使用OpenGL和Cocoa框架,并与libSDL.a和libSDLmain.a链接。

项目的结构非常简单:源文件位于项目的子目录中,名为src /,可执行文件构建在项目的根目录下。

问题在于,每当我尝试添加断点并对其进行调试时,断点似乎完全被击中但没有显示源 - 相反,我只是在代码窗口中得到“没有源可用于main()”错误。

编译器标志的优化设置为none,编译器和链接器都设置了调试符号标志(-g)。

Eclipse中的调试设置设置为“Standard spawn progess”,调试器设置为“gdb”。

现在最奇怪的是,如果我尝试调试完全相同的可执行文件 - 即。与Eclipse构建的完全相同 - 使用终端(shell)中的gdb然后一切正常。断点被击中,源代码显示,完全没有问题。

我确保Eclipse和shell都使用相同的gdb可执行文件,它们是(它是/ usr / bin / gdb)。

现在我可能错了,但是这一切都向我建议编译器和链接器标志不会有问题(因为相同的可执行文件可以从shell调试),所以大概是问题必须与gdb有关是从Eclipse中调用的?也许从Eclipse运行时,gdb会提取不同的配置文件或者什么,而不是从shell运行时? (有人知道吗?)

我真的很感激任何帮助,因为它正在慢慢推动我循环!

请告诉我是否有任何其他有用的细节 - Eclipse / cdt / gdb的确切版本号,确切的链接器/编译器命令行等等 - 我很乐意用它们更新这篇文章。

非常感谢,

thoughton。

--- 编辑@“14小时前” ---

我尝试了“添加文件系统路径”(带有“搜索子文件夹”)选项,但这不起作用。我也试过创建一个新的完全平坦的项目,但这也不起作用。 我甚至试图获得Galileo版本(带有CDT更新的eclipse-SDK-3.5.2RC4),但这没有任何区别(除了gdb启动速度较慢)。

这是我注意到的其他奇怪的事情:一旦我收到“No source available”消息,如果我然后切换Eclipse的控制台以显示“gdb”控制台,并打开“详细控制台模式”以便我可以进行通信然后,我可以发出“l”和“bt”命令并让它们成功运行,显示我的断点被击中的正确源和堆栈。哪,纠正我,如果我错了,必须意味着信息存在并正确调用gdb - 那么为什么Eclipse不会看到这些信息呢?

我已经接近放弃Eclipse,说实话......我也带着如此高的期望来到它。

非常感谢任何其他帮助或想法。

吨。

14 个答案:

答案 0 :(得分:29)

This thread建议:

-g -O0

为Eclipse CDT编译设置调试标志 有时,完全重建应用程序(like here

的问题很简单

另见this thread描述类似情况:

  

我注意到有时在Eclipse中我必须使用调试对话框中的“add filesystem path”(带有“search sub-folders”)专门添加源文件的路径(即使它们是在我调试的同一个项目中),但我没有注意到我必须这样做的模式。但它可能值得一试。

答案 1 :(得分:9)

我找到了答案!而且这很简单。

问题是我使用的是SDL的Release版本而不是Debug版本! (我有来自MacPorts的'libsdl',而我应该有'libsdl-devel'。)

所以我的通用答案是:确保您链接的libs也已经设置了调试标志,并不总是确保您自己的代码设置它们。

答案 2 :(得分:6)

这是此问题的另一个原因。我的配置使用-g3作为gcc的选项。将其更改为-g解决了问题。 gcc和gdb之间似乎存在一些不兼容性。我检查了gdb是最新版本(使用apt-get)。

答案 3 :(得分:4)

我想为这个旧帖添加一点新血。

当我尝试编译和调试gnu arm项目时遇到了这个问题。

我通过修改Makefile解决了这个问题: 添加" -g -O0"在这一行的末尾" CFLAGS + = -Wall -Werror -O3"

答案 4 :(得分:2)

转到项目属性,C / C ++构建 - >设置。在Cross GCC Compiler下的第一个选项卡(工具设置)上单击Debugging并将Debug Level设置为Maximum(-g3)

答案 5 :(得分:2)

我编译最新的gcc时遇到了这个问题,但没有更新到最新的gdb。更新后,它正常工作。

答案 6 :(得分:1)

对于可能遇到此问题的其他人,

我昨晚安装了linuxtools / valgrind插件来做一些内存分析,看来这打破了正常的gdb。当我删除linuxtools插件时,一切都恢复正常。

所以你可能想尝试一下。

答案 7 :(得分:1)

我有类似的问题。我正在使用CFLAGS=-Wall -O2 -fPIC -DPIC -lm -lasound并且从来没有编译它的问题但是当我尝试在Eclipse IDE上对它进行debbug时我得到了这个错误:No source available for "main() at 0x401080"然后我将-g添加到此行并且它运行良好:

  

CFLAGS = -g -Wall -O2 -fPIC -DPIC -lm -lasound

答案 8 :(得分:1)

考虑一下,如果你使用cmake来构建项目,解决方案的一种方法是添加" debug flag"到cmake命令,即 -

$ cmake / path / to / main / cmake_file - DCMAKE_BUILD_TYPE=Debug

答案 9 :(得分:0)

此问题取决于如何调用gdb。我发现当我收到错误时我需要手动指定源文件位置。即使我已经在项目属性下配置了它。执行此操作后,Eclipse不再在提供适当的源时出现问题。

使用库的发布与调试版本可能是您的特定问题(如果您从源代码构建库然后对其进行调试)。如果有人使用预编译库,他们将永远无法在其中设置断点,因此修复不适用于它们。

答案 10 :(得分:0)

一次遇到相同的问题。您只需转到项目属性,请按ALT + ENTR或右键单击项目并在底部向下滚动,即可找到属性。展开左侧的C / C ++构建。然后点击设置。打开设置后,然后单击工具设置。在MCU GCC编译器中,有一个调试选项。点击调试并添加

-g -O0
其他调试标志中的

。立即尝试调试项目。

答案 11 :(得分:0)

我只是遇到这个问题,花了一些时间才发现它,我意识到“调试配置”对话框中的“参数”和“主要”选项卡相互冲突。

确保C / C ++应用程序和程序参数指向同一二进制文件。

答案 12 :(得分:0)

似乎此消息可能有很多显示的原因。

对我来说(在微控制器调试中)是链接时优化。 -flto破了;从“其他选项”字段中删除-flto可以解决此问题。

在Eclipse Neon(4.6)中,请参阅项目->属性-> C / C ++构建->设置->工具设置-> C编译器->其他->其他选项。

答案 13 :(得分:0)

将此添加到您的 CMakeLists.txt

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS "-g")
set(CMAKE_C_FLAGS "-g")