stone2083

          pystack--python stack trace--讓python打印線程棧信息

          pystack: python stack trace. 類似java中的jstack功能.
          使用方式:
          1. https://pypi.python.org/pypi/pdbx/0.3.0 下載, 或者直接通過easyinstall安裝
          2. python scripts中, import pdbx; pdbx.enable_pystack(); 開啟pystack功能
          3. kill -30 pid , 就可以打印stack信息了. 
          如:
          "CP Server Thread-10" tid=4564467712
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)

          "CP Server Thread-9" tid=4560261120
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)

          "CP Server Thread-1" tid=4526608384
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)

          "CP Server Thread-7" tid=4551847936
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)

          "CP Server Thread-4" tid=4539228160
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)

          "CP Server Thread-2" tid=4530814976
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)

          "MainThread" tid=140735286018432
              at app.run()(raspctl.py:173)
              at return wsgi.runwsgi(self.wsgifunc(*middleware))(application.py:313)
              at return httpserver.runsimple(func, validip(listget(sys.argv, 1, '')))(wsgi.py:54)
              at server.start()(httpserver.py:157)
              at self.tick()(__init__.py:1765)
              at s, addr = self.socket.accept()(__init__.py:1800)
              at sock, addr = self._sock.accept()(socket.py:202)
              at pystack()(pdbx.py:181)
              at for filename, lineno, _, line in traceback.extract_stack(stack):(pdbx.py:169)

          "CP Server Thread-5" tid=4543434752
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)

          "CP Server Thread-8" tid=4556054528
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)

          "CP Server Thread-3" tid=4535021568
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)

          "CP Server Thread-6" tid=4547641344
              at self.__bootstrap_inner()(threading.py:525)
              at self.run()(threading.py:552)
              at conn = self.server.requests.get()(__init__.py:1367)
              at self.not_empty.wait()(Queue.py:168)
              at waiter.acquire()(threading.py:244)


          核心代碼:
          # pystack
          def pystack():
              for tid, stack in sys._current_frames().items():
                  info = []
                  t = _get_thread(tid)
                  info.append('"%s" tid=%d' % (t.name, tid))
                  for filename, lineno, _, line in traceback.extract_stack(stack):
                      info.append('    at %s(%s:%d)' % (line, filename[filename.rfind('/') + 1:], lineno))
                  print '\r\n'.join(info)
                  print ''

          def _get_thread(tid):
              for t in threading.enumerate():
                  if t.ident == tid:
                      return t
              return None

          def _pystack(sig, frame):
              pystack()

          def enable_pystack():
              signal.signal(signal.SIGUSR1, _pystack)

          有需要的朋友,趕緊拿走吧.

          posted on 2013-08-19 13:15 stone2083 閱讀(8071) 評論(0)  編輯  收藏 所屬分類: python

          主站蜘蛛池模板: 五大连池市| 竹北市| 景东| 宿迁市| 浑源县| 海宁市| 和顺县| 渭源县| 新丰县| 竹山县| 龙胜| 赣榆县| 平武县| 拜城县| 山阳县| 新干县| 温州市| 上栗县| 长春市| 湾仔区| 文化| 金昌市| 南城县| 库伦旗| 诸城市| 稷山县| 长顺县| 龙里县| 东丰县| 民丰县| 中方县| 易门县| 北流市| 枝江市| 赞皇县| 江陵县| 贵州省| 奇台县| 尼木县| 同心县| 东乡县|