草庐IT

c++ - LLDB 不显示源代码

coder 2023-06-01 原文

我正在尝试调试我正在编写的 C++ 程序,但是当我在 LLDB 中运行它并停止程序时,它只向我显示汇编程序,而不是原始源代码。 例如崩溃后我正在尝试调试:

Process 86122 stopped
* thread #13: tid = 0x142181, 0x0000000100006ec1 debug_build`game::update() + 10961, stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
    frame #0: 0x0000000100006ec1 debug_build`game::update() + 10961
debug_build`game::update:
->  0x100006ec1 <+10961>: movq   (%rdx), %rdx
    0x100006ec4 <+10964>: movq   %rax, -0xb28(%rbp)
    0x100006ecb <+10971>: movq   -0x1130(%rbp), %rax
    0x100006ed2 <+10978>: movq   0x8(%rax), %rsi

我正在使用 -O0 -g 进行编译。通过 Xcode(我在 OSX 上)或从命令行运行调试器时,我看到了同样的情况。

我还需要做什么才能让源代码显示在 LLDB 中?

补充说明

这是一个典型的构建命令示例:

clang++ -std=c++1y -stdlib=libc++ -fexceptions -I/usr/local/include -c -O2 -Wall -ferror-limit=5 -g -O0 -ftrapv lib/format.cpp -o format.o

早期的 -O2 存在,因为这是我使用的默认值,但我相信后来的 -O0 会覆盖它,对吧?

我的尝试

  1. 我用一个简单的“hello world”程序使用相同的build设置重新创建了这个问题。

  2. 经过一番搜索,我尝试运行 dsymutil main.o,它说 warning: no debug symbols in executable (-arch x86_64),所以也许是调试我的构建命令没有生成符号?

  3. 我也尝试将 -gsplit-dwarf 添加到构建命令中,但没有任何效果。

  4. 这是我的“hello world”版本的链接命令:

    clang++ main.o -L/usr/local/lib -g -o hello

  5. 我在可执行文件和目标文件上运行了 dwarfdump (I read about it here)。在我未经训练的眼睛看来,调试符号 出现在目标文件中,但不在可执行文件本身中(除非 dwarfdump 仅适用于目标文件,这是可能的) .所以也许链接阶段是问题所在。或者也许 DWARF 有问题。

  6. 我现在已经在“hello world”程序中工作了,通过在终端中一个一个地发出构建命令。因此,我猜测这可能是我的构建系统 (Tup) 的问题,可能是使用不同的工作目录运行命令,因此路径会被破坏或其他原因。

最佳答案

当您将 -g 命令行选项添加到 clang 时,DWARF 调试信息将放在 .o 文件中。当您将目标文件(.o、ranlib 存档又名静态库又名 .a 文件)链接到可执行文件/dylib/framework/bundle 中时,会放置“调试说明”在可执行文件中说明 (1) .o etc 文件的位置以及调试信息,以及 (2) 可执行二进制文件中函数/变量的最终地址。优化标志(-O0-O2 等)对调试信息的生成没有影响——尽管使用优化编译的调试代码比调试在 -O0

如果您在该可执行二进制文件上运行调试器 - 没有任何其他修改 - 调试器将从 .o 等文件中读取调试信息只要它们'在您构建可执行文件时仍在文件系统中的同一文件路径中。这使得迭代开发变得快速——没有工具需要读取、更新和输出(大)调试信息。您可以通过运行 nm -pa exename 并查找 OSO 条目(以及其他)在可执行文件中查看这些“调试说明”。这些是 stabs nlist 条目,在您的可执行文件上运行 strip(1) 将删除它们。

如果您想将所有调试信息(在 .o 文件中)收集到一个独立的包中,那么您可以在可执行文件上运行 dsymutil。这使用调试说明(假设:(1).o 文件仍在其原始位置,并且(2)可执行文件尚未被剥离)创建一个“dSYM捆绑”。如果二进制文件是 exename,则 dSYM 包是 exename.dSYM。当调试器在 exename 上运行时,它将在该二进制文件旁边查找 dSYM 包。如果在此处未找到,它将执行 Spotlight 搜索以查看 dSYM 是否位于您计算机上的 Spotlight 索引位置。

您可以在 .o 文件或 dSYM 包上运行 dwarfdump - 它们都包含调试信息。 dwarfdump 不会在您的输出可执行文件中找到任何调试信息。

所以,正常的工作流程:使用 -g 编译。链接可执行镜像。如果是迭代开发,运行调试器。如果发送/归档二进制文件,请创建 dSYM,剥离可执行文件。

关于c++ - LLDB 不显示源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36968721/

有关c++ - LLDB 不显示源代码的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  5. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  6. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  7. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  8. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  9. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  10. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

随机推荐