问题标签 [reverse-debugging]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
debugging - 我可以在核心转储文件中使用“反向调试”吗?
在 GDB 7.0 之后,支持反向调试。
生成核心转储时,我可以使用反向调试命令吗?
我怎样才能做到这一点?
gdb - 从 VirtualBox VM 中的 gdb 记录中提取执行日志
我正在尝试使用 gdb 的记录功能来生成为教程示例执行的指令列表
我可以使用 gdb 记录成功地前进和后退,并使用“记录保存”将执行日志保存到文件中。
我想我想做的是“记录指令历史”,它来自文档
从记录的执行日志中反汇编指令
但是当我尝试这个时,我得到了错误:
当您的目标是“记录已满”时,您不能这样做
尝试将记录目标设置为 btrace 会返回错误:
Target 不支持分支跟踪。
我在 VirtualBox VM 中运行 gdb 7.6,我需要在本地运行还是我缺少其他一些魔法。
lldb - 使用 lldb 进行反向调试
我已经阅读了本教程,但我还没有找到任何关于反向调试的信息。lldb 是否具有target record
gdb 中的某些功能?如果是,我在哪里可以读到它?
gdb - 如何在 GDB 中运行记录指令历史和函数调用历史?
(编辑:根据当前“技巧”下面的第一个答案,似乎正在使用 Atom 处理器。但我希望一些 gdb 大师可以回答这是一个基本限制,或者是否在路线图上增加对其他处理器的支持?)
反向执行似乎在我的环境中起作用:我可以反向继续,查看合理的记录日志,并在其中移动:
但是指令和功能历史不可用:
唯一可用的目标类型是完整的,另一个记录的类型“btrace”失败,并显示“目标不支持分支跟踪”。
所以很可能它只是不支持这个目标,但因为它是一个主流的现代目标(gdb 7.6.1-ubuntu,在 amd64 Linux Mint“Petra”上运行“Intel(R) Core(TM) i5-3570” ) 我希望我忽略了一个关键步骤或配置?
visual-studio-2013 - 我可以获得 Visual Studio 2013 Professional 的反向调试功能吗?
我知道 GDB 带有反向调试,但是有没有办法在 Visual Studio 2013 Pro 中获得这个功能?
c++ - 在 QtCreator 中为非 gui 方法启用反向调试
我在 Windows(使用 MingW、gcc、g++、make 和 gdb)和 Ubuntu 上安装了 2 个 QtCreator。在 2 操作系统上,我能够运行一些 Qt 程序(使用 Qt Windows)或控制台程序,以及调试程序。
但是我尝试了反向调试但没有成功;我检查了调试器选项中的“允许反向调试”选项,并且在调试视图中有一个称为“反向”的按钮,但是当我单击它时没有任何反应,它不会更改其他按钮,也不会改变这些按钮的效果(从前到后)。
c - 如何使用 GDB 反向调试通过函数调用跟踪值传播?
我试图找出一种方法来使用 GDB 反向调试在程序中通过函数调用和变量副本来跟踪值的传播。我过去经常使用 GDB,但对反向调试相对较新。
我认为用一个例子来描述这个问题是最容易的。看看这个程序。
我编译程序,然后使用反向调试启动 GDB 以运行编译后的可执行文件。printf
我在in处设置了一个断点FnA
,然后让程序开始执行,这导致我命中了那个断点。从这里,我想回答“最后一次x
写信到哪里?”这个问题。我可以做一个watch -l x
然后reverse-continue
。然而,这只会把我带到 的开头FnA
,因为那是x
它在堆栈上的生命周期开始的地方。我真正感兴趣的是i = 5
一路回溯的赋值,main
因为那是x
's 价值的来源。从i = 5
发生的那一刻起,真正的价值x
只是通过函数参数和变量副本传播,如下所示:main:i -> FnC:z -> FnB:y -> FnB:y_copy -> FnA:x
.
显然,我可以通过一些 GDB-fu 结合人类直觉来解决这个问题,但我正在努力使这个过程尽可能自动化。我最终想在更复杂的软件中尝试这个,使用人类直觉和 GDB-fu 会相当乏味。
有没有一种方便的方法可以通过反向调试在 GDB 中完成此任务?GDB 是否能够自动找出并遵循这些价值传播?
PS:具体来说,我实际上是在使用 GDB 和rr。rr 只是 gdb 的一个包装器,以允许确定性和可重现的执行上下文。我认为/希望核心问题保持不变,无论我是否使用带或不带 rr 的 gdb。
c - 对 GOT 所做的更改是否会在反向调试期间被撤销?
是否期望在反向调试期间不会恢复对程序地址空间所做的更改?
我一直在调试一个程序,当strlen
GOT 中的指针在执行过程中损坏时,该程序会出现段错误。感谢来自对此问题的评论的建议,我通过链接选项将该程序的 GOT 设为只读-z relro
;但是,这并不能防止有问题的指针被覆盖。即我可以在gdb中start
的程序,跳到第一次出现的,strlen
验证指针是否有效(例如:程序;例如:),提示.x/g 0x5555555d10a8 ==> 0x5555555d10a8 <strlen@got.plt>: 0x00007ffff7e8d1e0
continue
x/g 0x5555555d10a8 ==>
0x5555555d10a8 <strlen@got.plt>: 0x0000000000002156
segv
但是,如果我record full
整个执行(从第一行到程序段错误),然后awatch
是带有指针的地址strlen
during reverse-continue
,则观察点永远不会触发。当程序最终回到指令#0时,指针仍然指向它在段错误时所拥有的无效地址。
这导致了两个问题。首先,尽管有链接器选项,为什么 GOT 是可变的-z relro
?其次,是否期望strlen
在程序执行期间更改的内存中的某个位置(指向 的指针)在反向执行期间不会恢复到其原始值?
r - R:线性代码链的丰富调试
我试图弄清楚是否有可能通过大量的编程,通过使用 R 的元编程功能来创建某种调试功能。
假设我有一段代码,这样每一行都使用之前一行的输出作为其全部或部分输入——你可以用管道构建的那种代码(尽管这里没有使用管道)。
例如,它可能是:
f1 <- function(first_arg, second_arg, ...){my_body_code}
,
你f1
在块中调用:
其中foo_foo
是在 的调用环境中定义的对象f1
。
我想要一个可以环绕我的块的函数,它可以为每一行代码在列表中创建一个条目。每个条目都将被命名为 ( line1, line2
),并且每个行条目都有一个用于每个参数和函数输出的子条目。参数条目将首先包含与实际参数匹配的形式的名称,其次,如果有一个,则提供给该参数的表达式或名称(如果参数只是一个常量,则为占位符),第三,该表达式的值,就好像它在进入函数时立即被强制一样。(我宁愿在第一次遵守诺言时就获得价值,但在我看来,这似乎是一个更难的问题,而且这两个值通常是相同的)。
分配给...
(如果有的话)的所有参数都将放在一个dots = list() 子列表中,如果条目有名称,则命名为条目,..1, ..2,
如果它们按位置分配,则带有适当的标签(等)。每行子列表的最后一个元素是输出名称及其值。
这样做的目的是创建一个相当完整的代码块操作记录。我认为这类似于它的详细版本,purrr::safely
它不限于迭代并保留每个步骤的更详细记录,实际上,如果函数因错误退出,您会希望列表条目中的错误消息以及在产生错误之前可能有很多匹配的参数。
在我看来,这对于调试这样的线性代码非常有用。这使您可以仅使用 RStudio 调试器完成一些困难的事情。例如,它可以让您向后跟踪代码。在我看到后来的输出之前,我可能不知道 out2 中的值不正确。除非您插入一堆额外的代码,否则单步执行不会保留中间值。此外,这还保留了您在创建 Promise 之前跟踪发生的匹配错误所需的信息。当您通过单步操作看到此类错误导致的输出时,匹配信息可能已经消失了。
实际上,我已经编写了采用管道函数并消除管道以将其置于这种格式的代码,仅使用文本操作。(事实上,正是约翰·芒特的“Bizarro pipe”让我想到了这一点)。如果我,或者我们,或者你,可以弄清楚如何做到这一点,我希望在第二个版本上认真运行,每个函数调用下一个函数,在内部而不是外部为其提供参数——比如回溯您可以在其中获得传递的参数值以及函数名称和形式。其他语言也有类似的调试环境(例如 GDB),我一直希望 R 有一个至少五年,也许是 10 年,这似乎是朝着它迈出的一步。