2015-12-15 104 views
4

我有一個使用C++庫(通過swig導入)的django應用程序。 C++庫啓動自己的線程,在Python代碼中調用回調。在pycharm或eclipse + pydev的C線程中不工作python斷點

我無法在PyDev或PyCharm中設置python代碼中的斷點。 也試過'gevent兼容性'選項也沒有運氣。

我驗證了回調被正確調用爲logging.info轉儲什麼預期。在其他線程中設置的斷點工作正常。因此,python調試器似乎無法管理在非python代碼中創建的線程調用的python代碼中的斷點。

有誰知道解決方法?也許有一些'魔術'線程初始化序列可以使用?

回答

6

您必須設置調試器機制以使其能夠在非python線程上工作(這是在創建Python線程時自動完成的,但是當您創建一個線程時,Python沒有任何創建掛鉤時,您必須自己做) - 注意,對於某些框架(例如QThread/Gevent),事情是猴子修補的,以便我們知道初始化並啓動調試器,但對於其他框架,您必須自己做。

爲了做到這一點,啓動線程後,你必須調用:

import pydevd 
pydevd.settrace(suspend=False, trace_only_current_thread=True) 

請注意,如果你已經把suspend=True,它會模擬手動斷點,將在代碼的那個點停止。

+0

謝謝@Fabio Zadrozny!作品完美無瑕。由於我的回調是方法,我只是創建了一個元類,用初始化包裝它們。 –

+0

謝謝!在pycharm 2016.2中也是如此:)(只有我必須「安裝pydevd」) –

2

這是@ fabio-zadrozny答案的後續行動。

這是一個mixin,我創建了我的類(它從C線程獲取回調)從中繼承。

class TracingMixing(object): 
    """The callbacks in the FUSE Filesystem are C threads and breakpoints don't work normally. 
     This mixin adds callbacks to every function call so that we can breakpoint them.""" 

    def __call__(self, op, path, *args): 
     pydevd.settrace(suspend=False, trace_only_current_thread=True, patch_multiprocessing=True) 
     return getattr(self, op)(path, *args) 
+0

我正在用'python-fuse'編寫一個FS。我正在使用PyCharm。我的斷點沒有被擊中。我試圖把你的'TracingMixing'類放入我的代碼中,但它似乎沒有任何效果。你能否給出一個更詳細的例子來說明如何使用它。謝謝。 – noumenon