我正在尝试调试我正在编写的 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 会覆盖它,对吧?
我的尝试
我用一个简单的“hello world”程序使用相同的build设置重新创建了这个问题。
经过一番搜索,我尝试运行 dsymutil main.o,它说 warning: no debug symbols in executable (-arch x86_64),所以也许是调试我的构建命令没有生成符号?
我也尝试将 -gsplit-dwarf 添加到构建命令中,但没有任何效果。
这是我的“hello world”版本的链接命令:
clang++ main.o -L/usr/local/lib -g -o hello
我在可执行文件和目标文件上运行了 dwarfdump (I read about it here)。在我未经训练的眼睛看来,调试符号 出现在目标文件中,但不在可执行文件本身中(除非 dwarfdump 仅适用于目标文件,这是可能的) .所以也许链接阶段是问题所在。或者也许 DWARF 有问题。
我现在已经在“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/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格: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
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我主要使用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
在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
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的