草庐IT

c++ - 在 GDB 上编辑并继续

coder 2023-05-31 原文

我知道 E&C 是一个有争议的主题,有人说它会鼓励错误的调试方法,但是 - 我认为我们可以同意在很多情况下它明显有用 - 尝试一些常量的不同值,即时重新设计 GUI 参数以找到好看的外观......您可以命名它。

我的问题是:我们是否会在 GDB 上进行 E&C? 我知道这是一个特定于平台的功能,需要与编译器、调试器和操作系统进行认真的合作(MSVC 很容易做到这一点,因为编译器和调试器总是在一个包中),但是......它仍然应该是可行的。我什至听说过 Apple 在他们的 GCC 版本中实现了它[需要引用]。我会说这确实是可行的。

了解所有关于 MSVC 的 E&C 的炒作(我的经验表明这是 MSVC 用户在被问及 “为什么不切换到 Eclipse 和 gcc/gdb”时提到的第一件事),之后我感到非常惊讶好几年 GCC/GDB 仍然没有这样的功能。有什么好的理由吗?我们说话的时候有人在研究它吗?

最佳答案

这是一项令人惊讶的非平凡工作,包含许多设计决策和功能权衡。考虑:您正在调试。被调试者被挂起。它在内存中的图像包含源的目标代码,以及对象的二进制布局、堆、堆栈。调试器正在检查其内存镜像。它已将有关符号、类型、地址映射、pc (ip) 的调试信息加载到源对应关系。它显示调用堆栈、数据值。

现在您希望允许对代码和/或数据进行一组特定的可能编辑,而无需停止调试器并重新启动。最简单的可能是将一行代码更改为另一行。也许你重新编译那个文件或者只是那个函数或者只是那个行。现在,您必须修补被调试对象镜像,以便在您下次跨过它或以其他方式运行它时执行该新代码行。这在引擎盖下是如何工作的?如果代码大于它替换的代码行会发生什么?它如何与编译器优化交互?也许您只能在专门为 EnC 调试目标编译的上执行此操作。也许您会限制可能的站点,它对 EnC 是合法的。考虑一下:如果您在调用堆栈中暂停的函数中编辑一行代码会发生什么。当代码返回那里时,它是运行函数的原始版本还是运行您的行更改的版本?如果是原始版本,该来源来自哪里?

您可以添加或删除本地人吗?这对挂起帧的调用堆栈有什么影响?目前的功能?

你能改变函数签名吗?向对象添加字段/从对象中删除字段?现有的实例呢?挂起的析构函数或终结器呢?等等。

要使任何类型的可用 EnC 工作,需要注意很多很多功能细节。然后有许多跨工具集成问题需要提供基础设施来为 EnC 供电。特别是,它有助于拥有某种调试信息存储库,可以将编辑前和编辑后的调试信息和目标代码提供给调试器。对于 C++,PDB 中可增量更新的调试信息会有所帮助。增量链接也可能有所帮助。

从 MS 生态系统到 GCC 生态系统,很容易想象 GDB/GCC/binutils 之间的复杂性和集成问题、无数的目标、一些所需的 EnC 特定目标抽象以及“很高兴拥有但EnC 的“无关紧要”性质,是它尚未出现在 GDB/GCC 中的原因。

黑客愉快!

(p.s. 看看 Smalltalk-80 交互式编程环境可以做什么是很有启发性和启发性的。在 St80 中没有“重新启动”的概念——如果你编辑了图像和它的对象内存总是活的一个类的一个方面,你仍然必须继续运行。在这样的环境中,对象版本控制不是假设。)

关于c++ - 在 GDB 上编辑并继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4303599/

有关c++ - 在 GDB 上编辑并继续的更多相关文章

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

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

  2. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  3. ruby - 继续,未定义 callcc 方法 - 2

    我想学习一些关于Continuation的知识,使用callcc方法从一些文章中键入几个示例,但我遇到了错误:NoMethodError:undefinedmethod`callcc'formain:Objectfrom(pry):2:in`'没有文章提到包含延续库。那么如何解决这个问题呢?谢谢编辑:ruby1.9.2p290(2011-07-09修订版32553)[x86_64-linux] 最佳答案 您需要要求“继续”。require'continuation' 关于ruby-继续,

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. ruby - 安装libv8(3.11.8.13)出错,Bundler无法继续 - 2

    运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. ruby - 如何使用 fog 在 s3 上编辑文件? - 2

    我在s3上有一堆文件。我使用.fog配置文件设置了雾,这样我就可以启动fog并获得提示。如果我知道文件的路径,现在如何访问和编辑s3上的文件? 最佳答案 最简单的方法可能是使用IRB或PRY获取文件的本地副本,或者编写一个简单的脚本来下载、编辑然后重新上传。假设您有一个名为data.txt的文件。您可以使用以下脚本初始化与S3的连接。require'fog'connection=Fog::Storage.new({:provider=>'AWS',:aws_secret_access_key=>YOUR_SECRET_ACCESS_

  9. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  10. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

随机推荐