文章目录
前言
前两天在调试一个巨大的程序,跑起来都要几个小时,经过把训练集替换成测试集之后才快了一些,但是仍然有中途崩溃的问题。期间想了各种办法,并总结了这篇文章。
Debug是一门非常使用的技巧,一旦学会终身受益,而且这方面也很少有人去教我们。本文主要记录一些调试技巧
Pycharm Debug
hook 函数
my_hook_target_function_name = 'fun_to_hook'
hook_function_tmp_storage = eval(my_hook_target_function_name)
def _hook_target_function_replacement(*args):
hook_function_tmp_storage(*args)
# do your things
print('hook method [' + my_hook_target_function_name + ']...')
exec(my_hook_target_function_name + '=_hook_target_function_replacement')
修改fun_to_hook并在_hook_target_function_replacement
函数体内写hook之前或者之后的代码即可。在某些监视函数执行前的时机,例如查看当时的变量环境等可能会用到。
debug console
这个console使得我们可以在调试的时候和断点调试结合起来,debug栏有两个子栏,debugger可以查看变量,console可以输入一些动态执行的python代码,可以把上述的python hook代码输入其中,或者在输入程序报错之前的代码处打断点,不段调试函数的参数,从而无需重新运行整个程序,这对特大的python程序非常有意义。断点用于查看错误位置、console调试用于查看参数、函数错误。
console已知的问题
在debug console 里面输入的代码回车后跑起来如果时间过长,会出现下面的绿色>>>箭头,并且不再继续控制台输出,此时不是代表运行中途结束了,而是pycharm以为它结束了,实际上从未终止,按下回车后会继续执行的并输出所有刚刚隐藏起来的结果。
基于支持正则的文本编辑器批量修改
写代码的过程中我们常常需要把一部分代码迁移或者批量替换,虽然只是些文本,但是为了这个重新写一个py文件with open('file') as f
、 re.findall
、 re.sub
、 replace
实在太过冗余。其实直接在编辑器上修改就行了
在正则支持这一点和sublime、vscode是一样的
比如以下几个案例
把文本中的偶数和奇数分离
例如有以下文本 匹配[02468]
032154654132154612230125445310321546541321546122315465413012544531
0246424622024402464246224640244
31551315131553131551315131551315531
进阶,把奇数偶数交换
首先将偶数选中,拷贝保存到文件t_file里,并替换成t
tt3155135511tttttttt151315ttttt313155131ttttttttt315513ttttttt
然后正则选中想要替换的奇数,拷贝并替换成x
选中t,并粘贴x得内容
复制t_file里得内容,并将它粘贴到x上
应用场景:
适用于重复简单的修改类工作,例如将以下代码修改为GetX代码(散落分布在文件中的每一行)
// Navigator.pushNamed(context, "/image_preview", arguments: message);
// Navigator.pushNamed(context, "/video_play", arguments: message);
// Navigator.pushNamed(context, "/file_preview", arguments: message);
// Navigator.pushNamed(context, "/webview", arguments: param);
// Navigator.pushNamed(context, "/webview", arguments: param);
// Navigator.pushNamed(context, "/image_preview", arguments: tempMsg);
// Navigator.pushNamed(context, "/file_preview", arguments: tempMsg);
// Navigator.pushNamed(context, "/webview", arguments: param);
Get.toNamed("/image_preview", arguments: message);
Get.toNamed("/video_play", arguments: message);
Get.toNamed("/file_preview", arguments: message);
Get.toNamed("/webview", arguments: param);
Get.toNamed("/webview", arguments: param);
Get.toNamed("/image_preview", arguments: tempMsg);
Get.toNamed("/file_preview", arguments: tempMsg);
Get.toNamed("/webview", arguments: param);
或者用于把散落在每一行得模式1代码和模式2代码交换
后续探索
code-server 远程调试
如何使得code-server在远程调试的时候保持debug的状态?
例如在晚上11:30离开实验室的时候,需要搬走电脑,这时实验可能还没有跑完,debug状态需要保存。如果刷新网页,程序第二天debug的时候又要重新跑。如何让电脑关机的时候仍然能恢复debug的状态。为此,我开始对code-server各种测试。
根据以往使用推断,code-server断网重连能保持状态,刷新不行。猜测可能是因为会话的信息保存在浏览器里面。
为此我做了如下的实验测试:
我在21:04的时候虚拟机挂起,此时的变量环境为counter=10。21:16的时候查验,即已经断连了10分钟以上。
惊喜!变量仍然是保存的,继续断连半个小时,变量仍然是保存的
按着这个思路,我决定继续挂起,等到明天早上再查看这个程序的运行情况。
第二天早上检验。Word天!变量依然是保存的。
至于对特大程序vscode是否会采用另外一种策略还不得而知。