python - 附加 Python 调试器
问题描述
我想将 Python 调试器附加到正在运行的进程。在此评论之后,我尝试pdb-clone
了但感到困惑。这是我要附加的脚本:
import os
import time
from pdb_clone import pdbhandler
pdbhandler.register()
def loop(my_pid):
print("Entering loop")
while True:
x = 'frog'
time.sleep(0.5)
print("Out of Loop")
if __name__ == '__main__':
my_pid = os.getpid()
print("pid = ", my_pid)
loop(my_pid)
如果我python3 target_code_1.py
在一个终端运行并看到PID = 95439
,那么在第二个终端尝试
sudo pdb-attach --kill --pid 95439
我收到一条错误消息(如下所示)。
但是,假设我同时python3 target_code_1.py
在第三个终端中运行。我现在可以正常运行sudo pdb-attach --kill --pid 95439
,但是当我 print 时my_pid
,值为 95440。另一方面,如果我运行sudo pdb-attach --kill --pid 95440
并 print my_pid
,则值为 95439。(换句话说,它看起来像是pdb-attach
交换了它附加到的线程。 ) 这种行为似乎是可重复的。到底是怎么回事?
作为记录,最初的错误信息如下:
sudo pdb-attach --kill --pid 95440
Traceback (most recent call last):
File "/usr/local/bin/pdb-attach", line 4, in <module>
attach.main()
File "/usr/local/lib/python3.7/site-packages/pdb_clone/attach.py", line 646, in main
attach(address)
File "/usr/local/lib/python3.7/site-packages/pdb_clone/attach.py", line 596, in attach
for count in asock.connect_retry(address, verbose):
File "/usr/local/lib/python3.7/site-packages/pdb_clone/attach.py", line 115, in connect_retry
self.connect(address)
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncore.py", line 342, in connect
raise OSError(err, errorcode[err])
OSError: [Errno 22] EINVAL
FWIW,我在 macOS Mojave 10.14.2、Python 3.7.0、Clang 9.1.0 上运行。
(如果我以错误的方式解决这个问题,例如,如果有更好的 Python 模块可以附加到实时进程,我很乐意使用它。)
解决方案
推荐阅读
- jenkins - 有没有办法在 Jenkins 中显示 Jmeter 断言结果
- regex - 可以将后视与非固定长度模式结合使用吗?
- sed - sed 删除与包含斜杠的变量值匹配的字符串
- c# - 如何在 C# 中从 ASP.NET 调用 office-365 版本的 Excel?
- c# - 如果单击切换,如何将我的 RadzenTextBox 设置为 String.Empty
- java - 跨模块共享测试资源
- c# - 动态多态性/实例创建混乱
- c - 我的二叉搜索树 c 程序有问题。我使用的是中序遍历。为什么只打印根节点?
- go - 使用 golang 以与 openssl genrsa 相同的方式获取 RSA 密钥
- azure-logic-apps - 从 Azure 逻辑应用连接到 Azure SQL 服务器时出错