在git提交中调试可执行文件

时间:2018-05-17 22:49:10

标签: c++ git debugging gdb

有没有人想出一个很好的解决方案,使用git调试不同代码版本之间的可执行文件?基本上,我希望能够在我最近的一组提交和一组较旧的提交之间生成并行的可执行文件,并且跟踪相关的代码,并且在提交之间跳转时不会覆盖所有内容。

目前,我这样做的方法是编译/编译当前代码并重命名可执行文件和我试图在调试器中分析的任何代码(在我的例子中为gdb)。现在,对于旧的代码,我喜欢在签出旧的提交之前检查一个新的分支,因为我是偏执狂并且它构建了reflog以获得额外的安全性和检查指向(我知道这不是必需的)。我检查旧代码并在旧提交上运行make文件。现在,我有可以与gdb一起运行的并行可执行文件。这有点单调乏味,特别是如果一些标题/文件已经改变(我想分解我的代码),如果我现在想要进行更改和重新编译(我有大量的引用/包括,我基本上只是必须重新开始这个过程)。谁有更好的方法?

1 个答案:

答案 0 :(得分:2)

我最近在尝试调试/升级需要在系统上正确安装的库(使用 make install )时遇到了类似的问题,并在最后的稳定版本和开发版本之间进行了跳转。

从版本2.6.0开始(大约三年后),您现在可以使用

git worktree

它基本上允许你自己将任何地方的任何目录转换成官方git本地存储库的附件。它通过在其顶层填充.git文本文件(而不是常规子目录)来实现,其中包含指向原始文件的信息。在存储库方面,此附件被声明为如此,并创建了一个新分支。

因此,您现在可以同时对两个不同的修订版执行git checkout(每个工作目录一个)。您可以根据需要添加尽可能多的附件。完成后,只需删除所有无用的附件,然后调用git worktree prune使其解除不再存在的所有内容(如果其附件目录为,则可以使用git worktree lock来阻止删除其中的一些内容。有时可用,例如可移动设备)。这将允许您同时编译同一应用程序的两个不同版本。

但是,如果您需要检索软件的特定版本但在编译之前无法确定哪一个版本,则可能需要使用

git bisect run

...相反,它会自动调用一个脚本来判断修订是好还是坏。当编译相当长并且整个搜索可能持续数天时,这很有用。

以下是与 git worktree 相关的documentation page的链接。