Windows 下 Python 3 出 segfault 时如何找错? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yucongo
V2EX    Python

Windows 下 Python 3 出 segfault 时如何找错?

  •  
  •   yucongo 2017-07-01 10:29:28 +08:00 3945 次点击
    这是一个创建于 3024 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教各位在 Windows 下 Python 3 出 segfault 时如何有效地找错。

    Linux 下有 gdb。Windows 下 MinGW 的 gdb-python 好像只能用在 Python 2 上。我的程序是用 Python 3 写的,很多自己写的函数,2to3 应付不了,手动改要花很多时间。有在 qq 群里问过,有人建议用二分法删源码,直到 segment fault 不再出现就找到错了。这种方法好像效率太低,而且如果 segment fault 不是固定出现在某的地方不可用。

    GUI 下用个 thread、pubsub 什么的,出 segfault 还是比较常见的,而且 GUI ( pyqt,wxpython 之类的)程序的 Test 测试好像也没有什么好的办法,unitest、pytes 派不太上用场。各路高手用什么方法找导致 segfault 的错误?请分享一下,先感谢。

    20 条回复    2017-07-02 21:11:37 +08:00
    dbow
        1
    dbow  
       2017-07-01 10:34:39 +08:00   1
    完整的错误信息贴出来看看。
    yucongo
        2
    yucongo  
    OP
       2017-07-01 10:40:03 +08:00
    @dbow 出 segfault 是没有错误信息的,整个 python 死掉。
    ipwx
        3
    ipwx  
       2017-07-01 10:42:56 +08:00   1
    Python 出 Segment Fault 一般不是 Python 写的代码的问题。

    你写的、或者你引用的 native package 有问题。删掉整个 Python 3 重新安装一下吧?另外二进制的包如果用 Anaconda 装,一般会降低出问题的概率。
    dbow
        4
    dbow  
       2017-07-01 10:47:45 +08:00   1
    gdb --args ./app ..... 跑一遍, 出了 segment fault, 用 bt 命令, 输出 stack trace
    yucongo
        5
    yucongo  
    OP
       2017-07-01 10:56:02 +08:00
    感谢楼上 @ipwx、 @dbow 二位。

    不管是 native package 还是代码问题,都是想先找到出错的原因。gdb 貌似不能给出出错的 python 源码位置。看 stackoverflow 里说,gdb-python 倒是可以给出 python 源码位置。但 gdb-python 在 windows 里只能用于 Python 2. 我已经花了一天试着将我的 Python 3 改成 Python 2. 太麻烦、太乱,只好放弃。
    XYxe
        6
    XYxe  
       2017-07-01 11:07:46 +08:00   1
    @yucongo #5 用 VS 来编译 Python,然后参数加上你要运行的 Python 代码,应该可以定位到错误位置。
    yucongo
        7
    yucongo  
    OP
       2017-07-01 11:15:12 +08:00
    @XYxe 感谢。先记下来研究一下。VS 好像太大了,而且我的机器比较旧,怕是拖不动 VS。
    ipwx
        8
    ipwx  
       2017-07-01 11:22:47 +08:00
    @yucongo 你把你装的依赖包列一下我们看看吧。很可能某个第三方库的二进制包和你的 Python 二进制不太兼容…… 或者你的代码使用第三方库时导致了它内部二进制包的异常。

    另外最后的出错信息打出来看看也很重要。第三方库的二进制包出问题的 stack trace 和 Python 自己的二进制包出错,信息还是不一样的。
    congeec
        9
    congeec  
       2017-07-01 11:39:58 +08:00   1
    gdb-python 可以用于 python 3,不过你得自己编译安装。我试过,挺麻烦
    yucongo
        10
    yucongo  
    OP
       2017-07-01 12:02:26 +08:00
    @congeec 感谢提供信息。我想我会用 MinGW 试试。如果你有有关资料能提供一些链接什么的就更加感谢了。
    yucongo
        11
    yucongo  
    OP
       2017-07-01 12:10:47 +08:00
    certifi==2017.4.17
    chardet==3.0.2
    colorama==0.3.9
    cOnfigobj==5.0.6
    cx-Freeze==5.0.2
    future==0.16.0
    googletrans==2.1.3
    html2text==2016.9.19
    langdetect==1.0.7
    langid==1.1.6
    lxml==3.7.3
    nltk==3.2.2
    nose==1.3.7
    numpy==1.13.0
    pandas==0.20.2
    py==1.4.34
    pycountry==17.1.8
    pysrt==1.1.1
    pysubs2==0.2.1
    pytest==3.1.2
    python-dateutil==2.6.0
    python-docx==0.8.6
    pytz==2017.2
    pywin32==221
    PyYAML==3.12
    regex==2017.4.29
    requests==2.13.0
    requests-cache==0.4.13
    segtok==1.5.5
    six==1.10.0
    textblob==0.12.0
    tqdm==4.11.2
    wxPython==4.0.0a2.dev3016+2645796
    xlrd==1.0.0
    yandex.translate==0.3.5

    @ipwx Python 3.5 venv 下 pip freeze 的包

    因为看不懂 stack trace,所以一直在整 gdb-python,不过我试着用 gdb 在 Python 3 下获取 stack trace,成功的话在贴上来。
    zk8802
        12
    zk8802  
       2017-07-01 12:11:54 +08:00 via iPhone   1
    用 WinDBG 跑 Python,挂了之后输入 k 看一下调用栈,一般就知道是哪个库的问题了。如果问题不复杂,这可能是最快的方法。
    yucongo
        13
    yucongo  
    OP
       2017-07-01 12:55:29 +08:00
    @zk8802 感谢。我试试……
    congeec
        14
    congeec  
       2017-07-01 13:06:40 +08:00
    @yucongo https://github.com/fedora-python/python3/blob/master/python-gdb.py
    https://wiki.python.org/moin/DebuggingWithGdb
    https://docs.python.org/devguide/gdb.html
    你需要单独编译 gdb 和 CPython。编译 gdb 的时候,加--with-python="${the directory in which your python3 binary is installed}"。编译一份 CPython,记得用 debug 模式,这样调试时 step 到标准库,也会显示源码的
    ipwx
        15
    ipwx  
       2017-07-01 13:55:41 +08:00
    库我认不全,不过我认知的库里面,NumPy, wxPython 和 lxml 都有 native binary。也许应该注意一下。
    yucongo
        16
    yucongo  
    OP
       2017-07-02 01:24:11 +08:00   1
    貌似 Windows 下 Python 3 要找 segfault 出错的地方没有什么办法。再加上我的程序还是 wxpython GUI,完全没辙。我试过 Windbg,winpdb,trepan3k,pudb, 都不行。

    Windbg 里用 pykd 可以运行 python 非 GUI 程序,运行 wxpython 写的 gui 程序就出不来 gui。也可以在 python 下运行 wxpython 写的 gui 程序后 attach 到 Windbg, 但 attach 后 wxpython gui 就没有反应了, 也就是说没法 gui 里的交互(点击、载入文件啊什么的)。

    最后还是靠 logging …… 找到 python 一个 bug:

    os.startfile("")

    python ( 2.7, 3.4, 3.5 )直接死掉。try... except ... 没有用…… 花掉我一整天 ……&¥……%¥#
    nickr
        17
    nickr  
       2017-07-02 08:00:56 +08:00 via iPhone
    ” Windbg 里用 pykd 可以运行 python 非 GUI 程序,运行 wxpython 写的 gui 程序就出不来 gui。“

    这个尝试完全是晕了头. pykd 是 windbg 的一个插件. 在 windbg 里跑起来一个 python vm, 用来和 windbg 交互. 和 op 现在遇到的 python crash 八杆子打不着.
    yucongo
        18
    yucongo  
    OP
       2017-07-02 12:28:23 +08:00
    这个 os.startfile("") 导致 python.exe 崩溃其实只在 ConEmu 下才出现(我的是 32 位 Windows 7,ConEmu 161002 ),所以可能要算 ConEmu 的 bug 吧……
    yucongo
        19
    yucongo  
    OP
       2017-07-02 13:09:05 +08:00
    @nickr 感谢回答。

    我搞不太清楚。不过 Windbg 里 如果不 !load pykd.dll 是运行不了 !py 的。

    Windbg 里 Alt-1:
    0:000> !py -3.4
    No export py found
    0:000> !load pykd.dll
    0:000> !py -3.4
    Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>>
    hasdream
        20
    hasdream  
       2017-07-02 21:11:37 +08:00
    segfault 报错很多是 C 扩展不支持多线程操作, 比如多线程对一个 mysql(mysqldb)连接发起查询请求就会这样(每个线程开一个连接去查询就可以解决这个问题)。 大部分是 C 扩展一个回话不支持多线程操作 或者操作需要加锁
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2623 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 02:09 PVG 10:09 LAX 19:09 JFK 22:09
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86