我正在调用python -m pdb myapp.py,当异常触发时,我通常会被抛回到pdb解释器来调查问题.但是,在我调用curses.wrapper()并进入curses模式后抛出此异常,导致pdb解释器无效.我该如何解决这个问题?
假设我有一个python程序,其中assert用于定义事物应该是什么,并且我想用read-eval-loop捕获异常而不是AssertionError抛出.
当然,我可以
if (reality!=expectation):
print("assertion failed");
import pdb; pdb.set_trace();
Run Code Online (Sandbox Code Playgroud)
但是在代码中这比普通的更难看assert(reality==expectation).
我本可以在顶层pdb.set_trace()打电话except:,但后来我失去了失败的所有背景,对吧?(我的意思是,堆栈跟踪可以从异常对象中恢复,但不能从参数值中恢复,等等)
有没有像--magic命令行标志可以将python3解释器变成我需要的东西?
我对python和pdb比较新,但我对gdb有很多经验.
我的问题是,如果我在某些时候在我的代码中设置了一些断点,我会想要改变一些东西并重新运行我的调试会话,保留这些断点.但是,在我的pdb会话中输入"run"会导致我的会话以以下输出终止
(Pdb) run
Traceback (most recent call last):
File "/usr/lib64/python2.6/runpy.py", line 122, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib64/python2.6/runpy.py", line 34, in _run_code
exec code in run_globals
File "/usr/lib64/python2.6/pdb.py", line 1319, in <module>
pdb.main()
File "/usr/lib64/python2.6/pdb.py", line 1312, in main
pdb.interaction(None, t)
File "/usr/lib64/python2.6/pdb.py", line 198, in interaction
self.cmdloop()
File "/usr/lib64/python2.6/cmd.py", line 142, in cmdloop
stop = self.onecmd(line)
File "/usr/lib64/python2.6/pdb.py", line 267, in onecmd
return cmd.Cmd.onecmd(self, line)
File "/usr/lib64/python2.6/cmd.py", line 219, in onecmd
return func(arg)
File "/usr/lib64/python2.6/pdb.py", line …Run Code Online (Sandbox Code Playgroud) 如果我想运行一个脚本并且pdb捕获任何异常,我就这样调用它:
python -m pdb script.py
Run Code Online (Sandbox Code Playgroud)
要么:
pdb script.py
Run Code Online (Sandbox Code Playgroud)
问题是它立即在调试提示符处停止:
> /home/coiax/Junkyard/script.py(1)<module>()
-> import sys
(Pdb)
Run Code Online (Sandbox Code Playgroud)
我必须打字c或者continue让它去.有没有办法让它只是加载和启动脚本而不是最初询问我是否要设置任何断点或其他什么?
我发誓我已经阅读了pdb模块文档,并尝试制作一个包含的.pdbrc文件
c
Run Code Online (Sandbox Code Playgroud)
但它并没有自动启动.
我已经使用Plain调试了python脚本大约2年了from IPython import embed; embed(),并且运行良好。我只是将命令放在要检查的行上,并且在运行脚本时,我将拥有完整的IPython Shell,具有检查变量,定义函数等的能力。最重要的是,IPython Shell附带了变量名制表符。
现在,from IPython import embed; embed()我不再像总是用定义“暂停行” ,而是让我的python脚本在运行测试时遇到异常时暂停执行。
您如何pytest以这种方式运行,
# test_somemodule.py
def test_me(some_variable):
x = 1 + some_variable
return x
test_me('I am a string')
Run Code Online (Sandbox Code Playgroud)
(不,您不必像这样为pytest编写测试,但是出于示例目的,这很好。)
pytest --pdb(未pdbpp安装)pdb遇到错误时,这将打开基本外壳程序。但是它没有制表符补全。
-> x = 1 + some_variable
(Pdb) so[<tab_here_produces_tab>]
Run Code Online (Sandbox Code Playgroud)
pytest --pdb(与 pdbpp安装)pdbpp遇到错误时,这将打开基本外壳程序。但是没有制表符补全。
-> x = 1 …Run Code Online (Sandbox Code Playgroud) 我希望能够pdb在uWSGI下调试Python(Django)应用程序,并且我基本上遇到了与此处描述相同的问题:
...
File "/usr/lib/python2.7/bdb.py", line 49, in trace_dispatch
return self.dispatch_line(frame)
File "/usr/lib/python2.7/bdb.py", line 68, in dispatch_line
if self.quitting: raise BdbQuit
BdbQuit
Run Code Online (Sandbox Code Playgroud)
不同的是,我有不同的uWSGI设置,好像我不能让uWSGI以honour-stdin作为从上面的问题接受的答案建议.
我的设置如下:
1)我有一个systemd进程在Emperor模式下启动uWSGI
[Unit]
Description=uWSGI Emperor service
[Service]
ExecStart=/usr/local/bin/uwsgi --ini /etc/uwsgi/emperor.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
2)/etc/uwsgi/emperor.ini看起来像这样:
[uwsgi]
emperor = /etc/uwsgi/sites
uid = www-data
gid = www-data
limit-as = 1024
logto = /tmp/uwsgi-emperor.log
# I've tried adding both honour-stdin
# and daemons-honour-stdin here
honour-stdin = true …Run Code Online (Sandbox Code Playgroud) 我pdb之前一直用Python调试。最近,我开始使用 Visual Studio Code。
它在 Visual Studio Code 调试器中看起来,如果我设置 a breakpoint(),Visual Studio Code 将在左侧窗口的停止位置显示变量的值,我必须通过 GUI 栏来控制它。
因此,在"integratedTerminal"or中"externalTerminal",我无法通过此处显示的命令行进行控制,并且没有pdb提示弹出窗口。我觉得这让我感到惊讶,因为它劫持了纯 Python 的东西。
那么有没有办法同时拥有变量监视窗口和 pdb 提示控制呢?特别是在"integratedTerminal"或"externalTerminal".
以下是文件夹.vscode下的文件,
{
"python.pythonPath": "/Users/<USERNAME>/miniconda3/envs/<CONDA_ENV>/bin/python"
}
Run Code Online (Sandbox Code Playgroud)
{
"version": "0.2.0",
"configurations": [
{
"name": "Python Module",
"type": "python",
"python": "/Users/<USERNAME>/miniconda3/envs/<CONDA_ENV>/bin/python",
"request": "launch",
"program": "/Users/<USERNAME>/miniconda3/envs/<CONDA_ENV>/bin/<COMMAND>",
"console": "integratedTerminal",
"args": [
"hello-world"
],
"cwd": "${workspaceRoot}",
}
]
}
Run Code Online (Sandbox Code Playgroud) 最初我有一个包含测试服务器的Django应用程序.为了调试这个设置,我可以import pdb; pdb.set_trace()在代码中的任何地方添加一个断点,将我引入Terminal中的交互式调试器(在命令行上).
最近我转向了gunicorn以获得一些优势.使用此Gunicorn设置时,如何获得类似的行为.我已经通过设置gunicorn设置尝试debug=True和daemon=False,但它不工作.
有人有解决方案吗?
我正在使用PostSharp版本2.1.6.4(也尝试了最新版本2.1.7.35),有时pdb文件丢失,并且有一个pssym文件.
<?xml version="1.0" encoding="utf-8"?>
<Symbols xmlns="http://schemas.postsharp.org/2.0/symbols">
<Class Class="#1=T:[CrosscuttingLogging]CrosscuttingLogging.Attributes.LogMethodCallStatsAttribute" LimitedLicense="true" />
<Class Class="#2=T:[RequestLimiter]RequestLimiter.RequestCounterAttribute" LimitedLicense="true" />
</Symbols>
Run Code Online (Sandbox Code Playgroud)
我在构建过程中运行procmon,据我所知,postsharp.srv.4.0-x86.exe进程将dll和pdb文件从obj\Debug文件夹移动到obj\Debug\Before-PostSharp文件夹,然后在文件夹中生成一个新的dll obj\Debug,但是没有生成新的pdb文件.
对于我的一些dll(看似随机)会发生这种情况并且似乎不可靠,因为在其他机器上所有pdb文件都是正确生成的.
我正在尝试使用 pdb 调试 Python 程序。程序可能是这样的:
def main():
a = 1
print(b)
c = 2
d = 3
Run Code Online (Sandbox Code Playgroud)
显然,print(b) 是一个错字,应该是 print(a) 但这并不重要,我可以用文本编辑器修复它,但我想绕过这个错误并继续调试。
我试过跳转,比如跳转 4(假设“c=2”是第 4 行)但是我得到了错误“跳转失败:f_lineno 只能由行跟踪功能设置”,这意味着我需要在以下情况下提供行跟踪功能我在编程。
那么,有没有办法解决这个问题,或者在使用pdb时有没有其他方法可以绕过错误行?