ホームページ  >  に質問  >  本文

python中有没有像java中的jstack命令

天蓬老师天蓬老师2743日前983

全員に返信(3)返信します

  • PHPz

    PHPz2017-04-17 13:06:00

    没有像jstack那么方便直接用的东西,一般来说有几个方案:

    • IDE: 用诸如 PyCharm, Eclpise with Pydev 的工具调试,觉得挂起的时候暂停并检查各个调用栈。
    • GDB: 优点是可以调试到native extension,缺点也很明显,需要在编译Python的时候加上Debug Symbols,默认这个是没有的。简单的说就是功能强大但是配得麻烦。
    • pdb:适合下断点...
    • pudb: 改下代码,在程序入口import pudb; pudb.set_interrupt_handler(),在运行的时候就可以Ctrl-C进入到交互式调试环境,易用性还好吧。
    • 撸一个singal handler用于打印所有栈信息,参考 celery 实现的 install_cry_handler,或者看看 signalhandler,这个在 Python 3.3 自带了。

    NOTE: 所有依赖signal的方案,有个缺点就是,POSIX有很多函数会在这些中断产生时,返回EINTR,直接导致 Python 异常,比如send, recv, read, write 等等。。。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:06:00

    我不懂 Java,所以不清楚你想要的是什么。你是想打印出所有线程的调用栈吗?好像不容易的样子。

    我一般是:

    1. 尽量避免使用线程
    2. 打印日志。这样可以大致推断出线程在哪里卡住了
    3. strace 到各个线程上检查,看看它们卡在什么系统调用上了

    返事
    0
  • PHPz

    PHPz2017-04-17 13:06:00

    python直接用多线程貌似是不行的 因为有个叫GIL的东西 至于你想看线程情况 可以用pdb调试 试试

    返事
    0
  • キャンセル返事