主要观点:在使用 Python 编写游戏原型时遇到棘手 bug,因依赖随机性难以修复,游戏有两个随机源os.urandom
和random.randint
,尝试 mock 后发现还有第三方库调用random
函数,应将代码从第三方库中拉出并使用伪随机生成器函数,或用unittest.mock.patch
改变库的random
导入。要实现确定性随机性可通过多种方法,在不改变代码的情况下,ptrace
适合此任务,可通过ptrace
拦截和修改getrandom
系统调用的返回值,让os.urandom
返回零字节,random.randint
返回确定性随机数。
关键信息:
- 遇到 bug 及相关情况,如依赖随机性难修复等。
- 游戏的两个随机源及尝试的 mock 方法。
- 不同获取确定性随机性的方法及优缺点。
ptrace
的作用及相关代码实现细节,如找到进程 ID、attach 到进程、拦截和修改系统调用等。
重要细节:
- 用
strace
查看 Python 进程的系统调用,os.urandom
调用getrandom
获取字节,random.randint
在导入时被播种。 unrandom
程序通过ptrace
拦截getrandom
系统调用,在调用后将返回值修改为零字节。- 示例代码中展示了
unrandom
程序的具体实现过程,包括读取进程 ID、attach 到进程、拦截和修改系统调用等步骤。 - 提供了相关资源,如
ptrace
的 man 页、两篇有帮助的博客文章等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。