1,环境说明:
1)window10, pycharm, vs2017
2)被调试框架:pytorch, detectron2,mmdetection等(不限于)
2,步骤
1)首先要detectron2,mmdetection下编译通过,生成c++扩展的pyd,
例如:要生成roi_pool_cuda.cp36-win_amd64.pyd,nms_cuda.cp36-win_amd64.pyd,
_C.cp36-win_amd64.pyd等
2)编译cpu版本(debug调试最好用cpu)
把setup.py中的关于cuda的编译全部注释掉即可编译cpu版本。如:
#if (torch.cuda.is_available() and CUDA_HOME is not None) or os.getenv("FORCE_CUDA", "0") == "1":
# extension = CUDAExtension
# sources += source_cuda
#define_macros += [("WITH_CUDA", None)]
# extra_compile_args["nvcc"] = [
# "-DCUDA_HAS_FP16=1",
# "-D__CUDA_NO_HALF_OPERATORS__",
# "-D__CUDA_NO_HALF_CONVERSIONS__",
# "-D__CUDA_NO_HALF2_OPERATORS__",
# ]
# It's better if pytorch can do this by default ..
# CC = os.environ.get("CC", None)
# if CC is not None:
# extra_compile_args["nvcc"].append("-ccbin={}".format(CC))
sources = [os.path.join(extensions_dir, s) for s in sources]
3)编译debug版本
windows版本会调用默认的vs编译器编译c++扩展。本文设为vs2017
编译debug版就要添加vs2017编译器的编译选项
修改setup.py
以生成调试文件。必须将'/Zi' '
/Od'添加到 extra_compile_args
和'/DEBUG'
到extra_link_args
。
示例:
extra_compile_args = ['/Zi', '/Od']
ext_modules = [
extension(
"xx._C",
sources,
include_dirs=include_dirs,
define_macros=define_macros,
extra_compile_args=extra_compile_args,
extra_link_args=['/DEBUG'],
)
]
编译完成后生成*.pdb文件,如:_C.cp36-win_amd64.pdb
注意:
如果c++扩展模块是cpu,debug版,则框架(detectron2,mmdetection)也必须是cpu版本的,不能使用gpu版本
4)vs2017下 附加到进程进行调试
在pycharm下加断点于c++扩展模型函数上
打开vs2017->调试->选项->符号对话框中把3)中生成的*.pdb文件添加进去
vs2017->调试->附加到进程,选择python.exe进程
vs2017 打开c++扩展的cpp文件,并在要调试行上添加断点
pycharm上调试进入c++扩展模型函数,则断点就会进入到vs中,就可以进行调试了。
3,后记
祝你好运!!!
参考:
https://www.geek-share.com/detail/2711891029.html
https://www.cnpython.com/qa/82660