⑴ 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