⑴ riscv-gnu-toolchain 浜ゅ弶緙栬瘧鍣ㄥ備綍鏋勫緩錛
鎺㈢儲RISC-V鏋舵瀯鐨凣NU宸ュ叿閾炬瀯寤轟箣鏃浠嶨itee鍏嬮殕riscv-gnu-toolchain鐨勪富鍒嗘敮:
鎺ョ潃錛屽垎鍒鍏嬮殕RISC-V鐨凜緙栬瘧鍣錛坮iscv-gcc錛夈佹祴璇曟嗘灦錛坮iscv-dejagnu錛夈丟NU C搴擄紙riscv-glibc錛変互鍙婅交閲忕駭宓屽叆寮忓簱錛坮iscv-newlib錛:
涓轟簡璋冭瘯錛岃繕闇涓嬭澆RISC-V鐗堟湰鐨凣DB:
鍦ㄧ粓絝鍒涘緩涓涓鍚嶄負"build"鐨勭洰褰曪紝鐒跺悗鍒囨崲鍒拌ョ洰褰曪紝鎵ц屼互涓嬮厤緗鍛戒護錛
榪欎釜閰嶇疆灝嗗伐鍏烽摼瀹夎呭埌"/opt/riscv/gcc"錛岄渶瑕佽秴綰х敤鎴鋒潈闄愶紝鎵浠ヨ風『淇濅嬌鐢╯udo銆
浣跨敤澶氱嚎紼嬶紙-j8錛夊姞閫熺紪璇戣繃紼嬶細
緙栬瘧瀹屾垚鍚庯紝宸ュ叿閾懼皢鑷鍔ㄥ畨瑁呭埌鎸囧畾鐩褰曪紝鍙浠ラ氳繃楠岃瘉鐗堟湰淇℃伅鏉ョ『璁ゅ畨瑁呮槸鍚︽垚鍔燂細
沒有像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 自帶了。
⑶ 使用gdb查看python段錯誤(Segmentation fault)
公司有個業務是使用python腳本調用.so文件,但是有時候so文件內部發生錯誤,python就直接崩潰了,無任何提示信息,所以很不方便找錯誤原因.
使用 gdb 可以看到更詳細的一些信息,其使用方式如下:
ulimit -c 是查看創建的核心轉儲的最大大小,這里為0,是需要修改的,可以將其改成不限制大小的 unlimited .
cat /proc/sys/kernel/core_pattern 這一步我的理解是查看到時候生成的緩存文件存儲名稱,這里為 core ,表示其會在當前目錄下生成一個名為core的緩存文件,但是為了使其更加通用,可以修改一下其路徑和名稱格式.
可以看到在 var/cores 目錄下生成了一個 core.python.31796 文件,此時可以在剛才的運行目錄下執行,下面的 which 前面是`符號,不是單引號
此時可以看到項目最終是在 #0 0x00007f89d8700960 in mkl_pds_lp64_ladj_mod_pardiso () from /usr/lib/libmkl_intel_thread.so 時發生了錯誤,這個時候可以輸入 bt 查看更多,其從上到下是錯誤從底層到最外層的順序.
若執行的時候沒有 gdb ,可以執行 apt-get install gdb 安裝.
還有就是,若查看的時候錯誤地方是 #0 0x00000000005406df in ?? () 這樣的沒有具體函數名的情況,這是因為so文件在編譯時候沒有鏈接符號到文件裡面,需要在使用gcc編譯的時候加上 -g