检测执行流程分歧
Detect execution flow divergence
我有一个应用程序,它应该在给定相同输入的情况下产生相同的输出,但它在执行过程中产生不同的输出。
是否可以使用 GDB 来检测执行之间的分歧?是否可以将其自动化?
Is it possible to use GDB to detect divergence between executions?
如果应用程序是单线程的,reverse debugging can help. See this article 例如使用 UndoDB。
您还应该确保没有未初始化的内存读取,使用 Valgrind 或 MemorySantizer。
如果应用程序是多线程的,反向调试不太可能有帮助,但像 ThreadSanitizer 这样的数据竞争检测器可能有帮助。
Is it at all possible to automate this?
你当然可以(也应该)运行 {Address,Memory,Thread}Sanitizer 定期检查你的测试套件(你 确实 有一个测试套件,对吧? ).
通过反向调试,不需要更多的自动化。
如果您没有执行可能会根据系统状态 return 不同结果的系统调用,则您的程序中某处可能存在未定义的行为。
除了运行你的应用程序一步一步地找到问题之外,你可以用GDB做的事情不多。我推荐你 UndoDB 你的情况,它是一个很好的调试器,具有可逆执行功能。
正如@Employed Russian 指出的那样,您应该运行 一些工具来测试未初始化的内存,这是未定义行为的最常见原因之一。
我有一个应用程序,它应该在给定相同输入的情况下产生相同的输出,但它在执行过程中产生不同的输出。
是否可以使用 GDB 来检测执行之间的分歧?是否可以将其自动化?
Is it possible to use GDB to detect divergence between executions?
如果应用程序是单线程的,reverse debugging can help. See this article 例如使用 UndoDB。
您还应该确保没有未初始化的内存读取,使用 Valgrind 或 MemorySantizer。
如果应用程序是多线程的,反向调试不太可能有帮助,但像 ThreadSanitizer 这样的数据竞争检测器可能有帮助。
Is it at all possible to automate this?
你当然可以(也应该)运行 {Address,Memory,Thread}Sanitizer 定期检查你的测试套件(你 确实 有一个测试套件,对吧? ).
通过反向调试,不需要更多的自动化。
如果您没有执行可能会根据系统状态 return 不同结果的系统调用,则您的程序中某处可能存在未定义的行为。
除了运行你的应用程序一步一步地找到问题之外,你可以用GDB做的事情不多。我推荐你 UndoDB 你的情况,它是一个很好的调试器,具有可逆执行功能。
正如@Employed Russian 指出的那样,您应该运行 一些工具来测试未初始化的内存,这是未定义行为的最常见原因之一。