使用Visual Studio调试器调试Python CFFI时断点无法命中
我有一个面向嵌入式设备的C项目,希望通过CFFI调用其中部分代码用于测试和开发。CFFI单独编译运行正常,也能将Visual Studio调试器附加到python.exe来调试C文件。
Windows 10系统,搭配Visual Studio 2022和Visual Studio Build Tools 2022。
- 使用
extra_compile_args = ['/Zi', '/Od', '/DEBUG'], extra_link_args = ['/DEBUG']编译CFFI库 - 通过将.pdb文件路径添加到
Tools>Debugging>Symbols,告知Visual Studio其位置 - 启动Python代码,使其输出进程ID并暂停
- 将Visual Studio调试器附加到该进程
- 在需要的代码位置添加断点
此时断点带有警告标识,提示:
This breakpoint will currently not be hit. No symbols have been loaded for this document
我注意到编译CFFI时会生成Release文件夹,其中包含多个.obj、.exp和.lib文件,是否遗漏了某些链接步骤?
备注:我的代码分布在不同位置,不确定是否导致Visual Studio无法找到相关文件:
python-project/ │ ├── src/ │ └── cffi/ │ ├── cffi_compile │ └── cffi_run │ ├── src-cffi/ │ └── foo.c │ └── Release/ └── ... # this is generated by cffi, contains .obj, .exp, .lib c-project/ ├── bar.c └── bar.h
解决方法
确认调试符号生成
先检查Release文件夹里是否存在对应的.pdb文件——如果没有,说明编译参数未生效。在CFFI的set_source调用中添加debug=True,强制启用调试模式,确保pdb文件生成。匹配pdb与库文件
附加调试器后,打开VS的「调试>窗口>模块」,找到你的CFFI库(通常是_cffi_*.pyd后缀),查看「符号状态」列。如果显示未加载,右键选择「加载符号」,手动指向生成的pdb文件,确保pdb和当前运行的库是同一编译产物。映射源文件路径
由于C代码分散在不同目录,VS无法自动定位源文件。当首次触发C代码执行时,VS会弹出「查找源文件」窗口,手动选择对应.c文件的实际路径即可。也可以提前在VS的Tools>Options>Debugging>General里勾选「启用源服务器支持」,然后在Tools>Options>Debugging>Symbols下方添加你的C代码目录(src-cffi/、c-project/)作为源文件搜索路径。明确指定pdb生成路径
修改编译参数,手动指定pdb文件的生成位置,避免路径混乱:extra_compile_args = ['/Zi', '/Od', '/DEBUG', '/Fd"python-project/Release/cffi_debug.pdb"'], extra_link_args = ['/DEBUG', '/PDB:"python-project/Release/cffi_debug.pdb"']验证断点有效性
完成上述步骤后,重新编译CFFI库,启动Python进程并附加调试器,触发相关C函数调用后再添加断点,此时断点应该能正常命中。
内容的提问来源于stack exchange,提问作者NcG

