一流的龙岗网站建设,网站添加漂浮二维码怎么做,哪家公司搭建网站,微信小程序展示网站建设多少钱目录 为什么学习调试器Pycharm Debugger示例所用代码布局调试工具栏 Debug Bar程序控制工具栏 pdb查看源代码 l list查看当前函数源代码 ll longlist打印变量 p查看调用栈w where向上移动当前帧 u up向上移动当前帧 d down运行当前行代码,在第一个可以停止的位置停下 s step继续… 目录 为什么学习调试器Pycharm Debugger示例所用代码布局调试工具栏 Debug Bar程序控制工具栏 pdb查看源代码 l list查看当前函数源代码 ll longlist打印变量 p查看调用栈w where向上移动当前帧 u up向上移动当前帧 d down运行当前行代码,在第一个可以停止的位置停下 s step继续运行直到当前函数的下一行或当前函数返回为止 n next运行直到下一个断点 c continue打印函数返回值 retval跳出循环执行直到比当前行数大 unt until添加断点 b break启用/禁用断点 enable/disable修改代码清除断点 cl clear退出调试器 q quit 参考 为什么学习调试器
大家平时是怎么调试代码的呢我平时是这两种
使用print打印变量发布时再注释掉使用日志设置控制台为DEBUG模式发布时设置控制台为更严重级别就不用一个个注释print
第一个方式需要侵入代码且调试后需要注释有的时候忘记注释了一个print比较繁琐。第二个方式优雅了一些但有的时候就是写的小脚本不需要保存日志比较麻烦。 这两个还有一些缺点例如打印的不够多时还需要添加print或log然后再次运行。所以我们来学习一个更优雅的方式使用调试器。
Pycharm Debugger
示例所用代码
net_tools.py
import aiohttpasync def get_resp(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:print(response.status)return await response.text()
main.py
import asyncio
from net_tools import get_respasync def print_resp(url):res await get_resp(url)print(res)async def main():url_list [https://blog.csdn.net/lady_killer9/article/details/128891256,https://blog.csdn.net/lady_killer9/article/details/108763489]for url in url_list:await asyncio.create_task(print_resp(url))if __name__ __main__:asyncio.run(main())布局 左侧一列为调试工具栏、调试工具栏右侧是帧、再右侧是变量显示区域、上侧是程序控制栏。默认是Debugger标签页点击Console标签页可以查看程序的输出。
调试工具栏 Debug Bar
按钮提示和快捷键描述重新运行 CtrlF5单击此按钮可停止当前应用程序并再次运行它。继续程序 F9当应用程序暂停时单击此按钮可继续程序的执行即运行到下一个断点。暂停程序 CtrlPause单击此按钮可暂停程序执行。停止 CtrlF2单击此按钮可通过标准脚本在外部终止当前进程。shutdown查看断点 CtrlShiftF8单击此按钮可打开“断点”对话框您可以在其中配置断点行为。禁用断点使用此按钮可以切换断点状态。在“调试”工具窗口的工具栏中按下该按钮时项目中的所有断点都将禁用图标将变为灰色。可以暂时将项目中的所有断点静音以执行程序而无需在断点处停止。设置单击此按钮可打开包含以下选项的菜单 内联显示值选择此选项可启用内联调试功能该功能允许在编辑器中查看变量用法旁边的变量值。按字母顺序对值进行排序选择此选项可按字母顺序对“变量”窗格中的值进行排序。会话完成时取消静音断点选择此选项可在调试会话完成后重新启用所有禁用的断点。显示返回值选择此选项可在步进时显示当前帧中已执行函数的返回值。简化变量视图选择此选项可将以下名称包含在“特殊变量”组中 所有具有 DUNDER 名称的变量。和 的所有实例。functionclassobjmodule所有 IPython 内部变量如果已启动带有 IPython 的调试控制台。变量加载策略。您可以选择以下策略之一 同步如果选择此检查命令则显示的消息为 之后调试器将显示变量的值。Collecting data异步如果选择此检查命令则单独异步加载调试器中的变量。在这种情况下如果加载变量需要很长时间调试器会显示消息如果变量太慢则只有在调试器之后才会显示其值或消息。请注意建议切换到按需模式的警告消息。...Loading ValueLoading timed out按需如果选择此检查命令调试器将显示消息。单击它以启用加载。Show Value请注意加载策略中的任何更改在重新运行调试过程后生效。Pin TabClick this button to pin or unpin the current tab. You may need to pin a tab to prevent it from closing automatically when the maximum number of tabs is reached in this window.
单击3次按钮可以看到ul变量是url_list中的第一个。 单击按钮可以查看所有断点。可以通过Enabled复选框来禁用/启用某一个断点。 单击禁用所有断点。 单击继续执行程序Console标签页可以看到结果。 单击设置按钮可以看到有几个选项。
内联显示变量值会话结束时取消禁止断点显示返回值简化的变量视图异步加载值
程序控制工具栏
按钮提示和快捷键描述显示执行点 AltF10单击此按钮可在编辑器中突出显示当前执行点并在“帧”窗格中显示相应的堆栈帧。跨过 F8单击此按钮可执行程序直到当前方法或文件中的下一行跳过当前执行点引用的方法如果有。如果当前行是方法中的最后一行则执行步骤将紧跟在此方法之后执行的行。步入 F7单击此按钮可让调试器单步执行在当前执行点调用的方法。强行步入 AltShiftF7单击此按钮可使调试器单步执行当前执行点中调用的方法即使要跳过此方法也是如此。单步执行代码 AltShiftF7单击此按钮可跳过单步执行库源代码并专注于您自己的代码。步出 ShiftF8单击此按钮可使调试器从当前方法中单步执行转到紧随其后的行。运行到光标 AltF9单击此按钮可恢复程序执行并暂停直到执行点到达编辑器中当前光标位置的行。不需要断点。实际上插入符号处为当前行设置了一个临时断点一旦程序执行暂停该断点就会被删除。因此如果插入符号位于已执行的行则程序将恢复以进一步执行因为无法回滚到以前的断点。当您已深入单步执行方法序列并需要一次单步执行多个方法时此操作特别有用。如果为在将您带到指定行之前应执行的行设置了断点则调试器将在遇到的第一个断点处暂停。 如果需要在特定行处使用某种临时断点则使用此操作其中程序执行不应中断。 计算表达式 AltF8单击此按钮可 。计算表达式。
Pycharm版本不一样按钮图标可能不同
单击显示执行点按钮可以看到帧显示main.py:9行代码区域光标也显示在第9行 单击步入按钮会进入调用的库的函数中。
单击单步执行我的代码按钮会跳过导入的库直接进入自己写的函数或者下一行
pdb
有的时候在无界面的服务器上或容器中调试无法使用Pycharm就可以使用pdb了。 pdb有了两种使用方式一种是添加断点后直接运行侵入式
import pdb
pdb.set_trace()或
breakpoint()以下示例使用代码如下 main.py
import asyncio
import pdb
from net_tools import get_respasync def print_resp(url):res await get_resp(url)pdb.set_trace()print(res)async def main():url_list [https://blog.csdn.net/lady_killer9/article/details/128891256,https://blog.csdn.net/lady_killer9/article/details/108763489]for url in url_list:pdb.set_trace()await asyncio.create_task(print_resp(url))if __name__ __main__:asyncio.run(main())net_tools.py
import aiohttpasync def get_resp(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:print(response.status)return await response.text()frame帧pdb状态下会使用-代表当前帧 e:\workspace\python_workspace\debug_test\main.py(13)main()
- await asyncio.create_task(print_resp(url))
(Pdb) 查看源代码 l list
如果不带参数则列出当前行周围的 11 行或继续前一个列表。 如果用 . 作为参数则列出当前行周围的 11 行。 如果带有一个参数则列出那一行周围的 11 行。 如果带有两个参数则列出所给的范围中的代码 如果第二个参数小于第一个参数则将其解释为列出行数的计数。
(Pdb) l8 async def main():9 url_list [https://blog.csdn.net/lady_killer9/article/details/128891256,https://blog.csdn.net/lady_killer9/article/details/108763489]10 for url in url_list:11 import pdb12 pdb.set_trace()13 - await asyncio.create_task(print_resp(url))14 15 if __name__ __main__:16 asyncio.run(main())
[EOF]查看当前函数源代码 ll longlist
(Pdb) ll8 async def main():9 url_list [https://blog.csdn.net/lady_killer9/article/details/128891256,https://blog.csdn.net/lady_killer9/article/details/108763489]10 for url in url_list:11 import pdb12 pdb.set_trace()13 - await asyncio.create_task(print_resp(url))打印变量 p
p后面加上变量名即可
(Pdb) p url_list
[https://blog.csdn.net/lady_killer9/article/details/128891256, https://blog.csdn.net/lady_killer9/article/details/108763489]查看调用栈w where
(Pdb) we:\workspace\python_workspace\debug_test\main.py(16)module()
- asyncio.run(main())c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\runners.py(43)run()
- return loop.run_until_complete(main)c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(574)run_until_complete()
- self.run_forever()c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(541)run_forever()
- self._run_once()c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(1786)_run_once()
- handle._run()c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\events.py(88)_run()
- self._context.run(self._callback, *self._args)e:\workspace\python_workspace\debug_test\main.py(13)main()
- await asyncio.create_task(print_resp(url))可以看到调用栈接下来运行
await asyncio.create_task(print_resp(url))向上移动当前帧 u up
后面可加参数count在堆栈回溯中将当前帧向上移动 count 级
(Pdb) uc:\users\dell\appdata\local\programs\python\python37\lib\asyncio\events.py(88)_run()
- self._context.run(self._callback, *self._args)向上移动当前帧 d down
后面可加参数count在堆栈回溯中将当前帧向下移动 count 级
(Pdb) de:\workspace\python_workspace\debug_test\main.py(13)main()
- await asyncio.create_task(print_resp(url))运行当前行代码,在第一个可以停止的位置停下 s step
step在被调用的函数内部或在当前函数的下一行停下所以可以用step进入函数
(Pdb) s
--Call--c:\users\dell\appdata\local\programs\python\python37\lib\asyncio\tasks.py(345)create_task()
- def create_task(coro):继续运行直到当前函数的下一行或当前函数返回为止 n next
next 和 step 之间的区别在于step 进入被调用函数内部并停止而 next 几乎全速运行被调用函数仅在当前函数的下一行停止。
(Pdb) nc:\users\dell\appdata\local\programs\python\python37\lib\asyncio\tasks.py(350)create_task()
- loop events.get_running_loop()运行直到下一个断点 c continue
(Pdb) c
200e:\workspace\python_workspace\debug_test\main.py(8)print_resp()
- print(res)打印函数返回值 retval
(Pdb) retval
None跳出循环执行直到比当前行数大 unt until
(Pdb) uc:\users\dell\appdata\local\programs\python\python37\lib\asyncio\events.py(88)_run()
- self._context.run(self._callback, *self._args)
(Pdb) uc:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(1786)_run_once()
- handle._run()
(Pdb) uc:\users\dell\appdata\local\programs\python\python37\lib\asyncio\base_events.py(541)run_forever()
- self._run_once()
(Pdb) c接下来使用另外一种方式去除断点后直接运行非侵入式
python3 -m pdb main.py添加断点 b break
b后可以使用lineno 或function 参数设置断点一个是行号一个是函数名。不加参数时列出所有断点。 如果带有 lineno 参数则在当前文件相应行处设置一个断点。 如果带有 function 参数则在该函数的第一条可执行语句处设置一个断点。
(venv) E:\Workspace\python_workspace\debug_testpython -m pdb main.pye:\workspace\python_workspace\debug_test\main.py(1)module()
- import asyncio
(Pdb) b 9
Breakpoint 1 at e:\workspace\python_workspace\debug_test\main.py:9
(Pdb) b 10
Breakpoint 2 at e:\workspace\python_workspace\debug_test\main.py:10
(Pdb) b
Num Type Disp Enb Where
1 breakpoint keep yes at e:\workspace\python_workspace\debug_test\main.py:9
2 breakpoint keep yes at e:\workspace\python_workspace\debug_test\main.py:10
启用/禁用断点 enable/disable
命令后加断点编号即可
(Pdb) disable 1
Disabled breakpoint 1 at e:\workspace\python_workspace\debug_test\main.py:9
(Pdb) enable 1
Enabled breakpoint 1 at e:\workspace\python_workspace\debug_test\main.py:9修改代码
(Pdb) ce:\workspace\python_workspace\debug_test\main.py(10)main()
- for url in url_list:
(Pdb) p url_list
[https://blog.csdn.net/lady_killer9/article/details/128891256, https://blog.csdn.net/lady_killer9/article/details/108763489]
(Pdb) url_list [https://www.baidu.com/s?tn44004473_30_oem_dgieutf-8wdlady_killer9]
(Pdb) p url_list
[https://www.baidu.com/s?tn44004473_30_oem_dgieutf-8wdlady_killer9]
清除断点 cl clear
如果参数是 filename:lineno则清除此行上的所有断点。 如果参数是空格分隔的断点编号列表则清除这些断点。 如果不带参数则清除所有断点但会先提示确认输入y或者n。
(Pdb) clear
Clear all breaks? y
Deleted breakpoint 1 at e:\workspace\python_workspace\debug_test\main.py:9
Deleted breakpoint 2 at e:\workspace\python_workspace\debug_test\main.py:10
(Pdb) c
200
!DOCTYPE html
html langzh-CN
headmeta charsetutf-8title百度安全验证/titlemeta http-equivContent-Type contenttext/html; charsetutf-8meta nameapple-mobile-web-app-capable contentyesmeta nameapple-mobile-web-app-status-bar-style contentblackmeta nameviewport contentwidthdevice-width, user-scalableno, initial-scale1.0, minimum-scale1.0, maximum-scale1.0meta nameformat-detection contenttelephoneno, emailnolink relshortcut icon hrefhttps://www.baidu.com/favicon.ico typeimage/x-iconlink relicon sizesany mask hrefhttps://www.baidu.com/img/baidu.svgmeta http-equivX-UA-Compatible contentIEEdgemeta http-equivContent-Security-Policy contentupgrade-insecure-requestslink relstylesheet hrefhttps://ppui-static-wap.cdn.bcebos.com/static/touch/css/api/mkdjump_aac6df1.css /
/head
bodydiv classtimeout hide-callbackdiv classtimeout-img/divdiv classtimeout-title网络不给力请稍后重试/divbutton typebutton classtimeout-button返回首页/button/divdiv classtimeout-feedback hide-callbackdiv classtimeout-feedback-icon/divp classtimeout-feedback-title问题反馈/p/divscript srchttps://ppui-static-wap.cdn.bcebos.com/static/touch/js/mkdjump_v2_21d1ae1.js/script
/body
/htmlThe program finished and will be restarted退出调试器 q quit
(Pdb) q思考题 查看官方文档使用第二种方式启用pdb时如何给net_tools.py文件添加断点 如何进入net_tools.py文件中的函数内部
把答案打在评论区。。。
参考
Pycharm-debugtoolbar python-pdb