使用包含的cpp文件无法解析xcode断点 - MacOS

时间:2017-02-19 16:42:13

标签: c++ xcode debugging lldb macos-sierra

更新:根据Jason Molenda给出的答案,我意识到设置命令根本不是问题 - 它正在被正确读取并且具有正确的值,但是仍然有断点没有解决。我已经更改了主题名称以更准确地解决问题。

问题摘要:我包含cpp文件,当使用gutter设置断点时,Xcode无法解析它们,应用程序是在外部构建的(不是在Xcode中开发的),而我的.lldbinit已经设置了target.inline-breakpoint-战略始终如一。

以前的版本: 我的问题是我无法让Xcode的调试器在包含的.cpp文件中断点(来自外部构建的应用程序,只是尝试使用Xcode作为调试器)。

我发现答案是将以下内容添加到.lldbinit文件中:

设置设置target.inline-breakpoint-strategy始终

我做到了。它似乎根本没有阅读,也没有改变任何东西。使用以下命令自行运行命令时

命令source~ / .lldbinit

它告诉我:

-bash:settings:command not found

我不明白为什么它无法弄清楚'settings'命令。我将补充一点,我对该文件应该如何工作知之甚少,但我看到这个命令在许多lldbinit文件中使用没有问题。

我搜索了有关此内容的信息,无论我如何搜索,Google都绝对没有任何相关内容。

其他说明:

- 应用程序是使用调试信息构建的。

- 要设置Xcode,我创建了一个空项目,设置一个新方案的可执行文件来调试我构建的那个,并添加了代码浏览的代码文件夹引用。

-I使用Xcode装订线添加断点。

- 我正在使用MacOS 10.12 - Sierra,而不是Linux,以及Xcode 8.2.1。

- 如果我通过命令行运行LLDB并使用:b filename.cpp:line设置断点,一切正常。即使我手动运行时遇到'settings:command not found'错误,也是如此。但它从未在Xcode的可视化调试器中运行。也许我被这个错误误导了?

-Breakpoints在包含其他文件的基本.cpp文件中正常工作,但在任何包含的文件中都没有。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

好的,这个问题在最近几天一直困扰着我,互联网上几乎没有什么可以帮助 - 但我终于明白了!有点意外 - 我摆弄了东西,现在它起作用了一些完全神秘的原因。

这适用于Xcode 8 - macOS Sierra - 2010年中期计算机

问题:

在外部版本中,断点适用于主cpp文件,但断点不适用于任何包含的文件 - “#include”附带的cpp文件。 lldbinit设置无助于改善这种情况。

<强>症状:

使用包含的文件中创建的一些新断点运行程序,然后按xcode调试器中的pause键。 在LLDB控制台(屏幕右下角)中,键入: 断点列表 您将看到所有断开的断点在其末尾显示“location = 0(pending)”。如果您从主文件添加工作断点,您会看到它显示“location = 1”。

<强>解决方案:

在项目管理器中,单击主项目文件,然后单击目标,转到“信息” - 因为我假设您能够正确构建,您将拥有build.sh文件的路径在“构建工具”框中。但请确保“目录”框为空(我的参数框也为空,但我怀疑这是相关的。)

一旦该目录框为空,build.sh将不再有效,因为它无法找到您的文件。要解决这个问题,请像这样对您的路径进行硬编码:

clang++ -g -I/usr/local/include/SDL2 -lSDL2 /absolute/path/to/sdl_mygame.cpp -o /absolute/path/to/mygameexecutable

现在构建工作,并且神秘地,现在你的断点全部工作!

关于我的设置的其他说明:

  • 我将此项目创建为外部构建
  • 我创建了一个目标 指向我的构建文件并取消选中“传递构建设置” 环境“
  • 我在Build下的Scheme中选择了这个目标。
  • 我在运行中选择了我的方案中的可执行文件并检查了Debug 可执行文件
  • 大多数其他xcode设置似乎没有必要。
  • 我跟随手工制作的英雄

希望这有帮助!

答案 1 :(得分:0)

val unigram = new NGram().setN(1).setInputCol("words").setOutputCol("unigram") val hashingTFunigram = new HashingTF().setInputCol(unigram.getOutputCol).setOutputCol("tfFeatures").setNumFeatures(5000) val bigram = new NGram().setN(2).setInputCol("words").setOutputCol("bigram") val hashingTFbigram = new HashingTF().setInputCol(bigram.getOutputCol).setOutputCol("tfFeaturesbigram").setNumFeatures(5000) val trigram = new NGram().setN(3).setInputCol("words").setOutputCol("trigram") val hashingTFtrigram = new HashingTF().setInputCol(trigram.getOutputCol).setOutputCol("tfFeaturestrigram").setNumFeatures(5000) val assembler = new VectorAssembler() .setInputCols(Array("tfFeaturesunigram", "tfFeaturesbigram", "tfFeaturestrigram")) .setOutputCol("tfFeatures") 应该在lldb中运行。你从shell运行它;该错误消息来自bash。 (&#34; command source ~/.lldbinit&#34;并不意味着什么要打击)

当您的项目包含源文件(而不仅仅是标题)时,需要

settings。这并不常见,因此它不是默认行为 - 它会降低调试器的性能,以扫描每个文件,如此处所需。它是https://lldb.llvm.org/troubleshooting.html顶部的文件。大多数人不需要这种设置。

我不确定为什么Xcode中的断点,当您点击源编辑器的断点装订线时,正在工作。这可能是一个单独的问题。如果您启动项目并暂停它,则可以执行

settings set target.inline-breakpoint-strategy always
在调试器控制台窗口中

验证它是否像您想要的那样(lldb) settings show target.inline-breakpoint-strategy 。如果您的断点不起作用,我首先会查看您的构建设置,看看您的某个构建设置是否没有生成调试信息。