gdbpython調試
沒有像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 自帶了。
② 如何用pdb進行python調試
本文章講述了如何用pdb進行python調試講解.
當手邊
沒有IDE,面對著python調試犯愁時,你就可以參考下本文;(pdb 命令調試)
和 (pdb)help
用pdb進行python調試,用法基本和gdb差不多,
先看一個簡單的例子:
epdb1.py .# epdb1.py -- experiment with the Python debugger, pdb
a = "aaa"
b = "bbb"
c = "ccc"
final = a + b + c
print final
比如要對這個程序進行調試:
1:在文件前面加上這一句,引入調試的模塊。
import pdb
2:在要開始調試的一行加上pdb.set_trace()文件變成:
# epdb1.py -- experiment with the Python debugger, pdb
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final 可以運行這個程序,到斷點出會停下來,和gdb類似,
可以執行命令:
直接回車是重復前一條命令!
p(print) 查看一個變數值
n(next) 下一步
s(step) 單步,可進入函數
c(continue)繼續前進
l(list)看源代碼
用pdb調試有多種方式可選:
1.命令行啟動目標程序,加上-m參數,這樣調用myscript.py的話斷點就是程序的執行第一行之前
python -m pdb myscript.py
2. 在Python交互環境中啟用調試
>>> import pdb
>>> import mymole
>>> pdb.run('mymole.test()')
3.比較常用的,就是在程序中間插入一段程序,相對於在一般IDE裡面打上斷點然後啟動debug,不過這種方式是hardcode的 if __name__ == "__main__" :
a = 1
importpdb
pdb .set_trace()
b = 2
c = a + b
print( c)
然後正常運行腳本,到了pdb.set_trace()那就會定下來,就可以看到調試的提示符(Pdb)了
常用的調試命令 h(elp),會列印當前版本Pdb可用的命令,如果要查詢某個命令,可以輸入 h [command],例如:"h l" - 查看list命令
l(ist),可以列出當前將要運行的代碼塊
(Pdb) l
497 pdb.set_trace()
498 base_data = {}
499 new_data = {}
500 try:
501 execfile(base_file_name,{},base_data)
502 -> execfile(new_file_name,{},new_data)
503 except:
504 logger.writeLog("error! load result log error!")
505 print "load cmp logs error!"
506 raise Exception, "load cmp logs error!"
507>斷點設置
(Pdb)b10 #斷點設置在本py的第10行
或(Pdb)bots.py:20 #斷點設置到 ots.py第20行
刪除斷點(Pdb)b #查看斷點編號
(Pdb)cl 2 #刪除第2個斷點
>運行
(Pdb)n #單步運行
(Pdb)s #細點運行 也就是會下到,方法
(Pdb)c #跳到下個斷點
>查看
(Pdb)p param #查看當前 變數值
(Pdb)l #查看運行到某處代碼
(Pdb)a #查看全部棧內變數 b(reak), 設置斷點,例如 "b 77″,就是在當前腳本的77行打上斷點,還能輸入函數名作為參數,斷點就打到具體的函數入口,如果只敲b,會顯示現有的全部斷點
(Pdb) b 504
Breakpoint 4 at /home/jchen/regression/regressionLogCMP.py:504 condition bpnumber [condition],設置條件斷點,下面語句就是對第4個斷點加上條件"a==3"
(Pdb) condition 4 a==3
(Pdb) b
Num Type Disp Enb Where
4 breakpoint keep yes at /home/jchen/regression/regressionLogCMP.py:504
stop only if a==3 cl(ear),如果後面帶有參數,就是清除指定的斷點(我在Python2.4上從來沒成功過!!!);如果不帶參數就是清除所有的斷點
(Pdb) cl
Clear all breaks? y disable/enable,禁用/激活斷點
(Pdb) disable 3
(Pdb) b
Num Type Disp Enb Where
3 breakpoint keep no at /home/jchen/regression/regressionLogCMP.py:505 n(ext),讓程序運行下一行,如果當前語句有一個函數調用,用n是不會進入被調用的函數體中的
s(tep),跟n相似,但是如果當前有一個函數調用,那麼s會進入被調用的函數體中
c(ont(inue)),讓程序正常運行,直到遇到斷點
j(ump),讓程序跳轉到指定的行數
(Pdb) j 497
> /home/jchen/regression/regressionLogCMP.py(497)com pareLog()
-> pdb.set_trace() a(rgs),列印當前函數的參數
(Pdb) a
_logger =
_base = ./base/MRM-8137.log
_new = ./new/MRM-8137.log
_caseid = 5550001
_toStepNum = 10
_cmpMap = {'_bcmpbinarylog': 'True', '_bcmpLog': 'True', '_bcmpresp': 'True'} p,最有用的命令之一,列印某個變數
(Pdb) p _new
u'./new/MRM-8137.log' !,感嘆號後面跟著語句,可以直接改變某個變數
q(uit),退出調試
==============================================================================================
在python中使用pdb模塊可以進行調試
import pdb
pdb.set_trace()
也可以使用python -m pdb mysqcript.py這樣的方式
(Pdb) 會自動停在第一行,等待調試,這時你可以看看 幫助
(Pdb) h
說明下這幾個關鍵 命令
>斷點設置
(Pdb)b 10 #斷點設置在本py的第10行
或(Pdb)b ots.py:20 #斷點設置到 ots.py第20行
刪除斷點(Pdb)b #查看斷點編號
(Pdb)cl 2 #刪除第2個斷點
>運行
(Pdb)n #單步運行
(Pdb)s #細點運行 也就是會下到,方法
(Pdb)c #跳到下個斷點
>查看
(Pdb)p param #查看當前 變數值
(Pdb)l #查看運行到某處代碼
(Pdb)a #查看全部棧內變數
(Pdb)w 列出目前call stack 中的所在層。
(Pdb)d 在call stack中往下移一層
(Pdb)u 在call stack中往上移一層。如果在上移一層之後按下 n ,則會在上移之後的一層執行下一個敘述,之前的 function call 就自動返回。
(Pdb)cl 清除指定的斷點。如果沒有帶參數,則清除所有斷點。
(Pdb)disable 取消所有斷點的功能,但仍然保留這些斷點。
(Pdb)enable 恢復斷點的功能。
(Pdb)ignore 設定斷點的忽略次數。如果沒指定 count,其初始 為 0。當 count 為 0 時,斷點會正常動作。若有指定 count,則每次執行到該中斷, count 就少 1,直到 count 數為 0。
(Pdb)condition bpnumber [condition]
(Pdb)j(ump) lineNo. 跳到某行執行。只有在 call stack 的最底部才能作用。
(Pdb)l 列出目前所在檔案中的位置。連續地 l 命令會一直列到檔案結尾,可以使用指定行數或范圍來列印。
(Pdb)pp 和 p 命令類似,但是使用 pprint mole(沒用過 pprint,詳情請參考 Python Library Reference)。
(Pdb)alias 以一個"別名"代替"一群除錯命令",有點類似 c/c 的 macro(詳情請參考 Python Library Reference)。
(Pdb)unalias 取消某個 alias。
(Pdb)[!]statement 在目前的環境(context)中執行敘述。
轉載
③ sublime text怎麼調試python代碼
1.有SublimeREPL應該就可以調試了,輸入沒問題,調試的時候記得選
tools->SublimeREPL->python->run current file 或者 pdb current
file (pdb 是調試工具,類似gdb)
不要用預設的build 或者 ctrl-b
2.運行調試前別忘了保存,要不不會運行修改後的文件
④ logging:多線程調試時用來代替print和單步調試
當你要寫多線程項目時,不免要調試錯誤,要debug。
一般debug的工具就是列印函數print, 調試工具gdb進行單步調試,但是多線程時,單步調試就很雞肋了,這時就需要列印日誌了
沒錯,列印日誌無疑是調試多線程工程的高效工具了。
在python中開發,就要用到logging日誌庫了
logging庫已經封裝好日誌需要的基本功能,能夠實現在文件里,在命令行等寫日誌
還能輸出日誌信息的類型,如debug,warning,error等
細節在這里有所介紹:
https://docs.python.org/3/howto/logging.html
文本介紹一下,第一次使用logging時,要熟悉logging時,需要用一個非常簡單的例子
先看一個最簡單的例子:
運行以上代碼:
printed out on the console. The INFO message doesn』t appear because the default level is WARNING . The printed message includes the indication of the level and the description of the event provided in the logging call, i.e. 『Watch out!』. Don』t worry about the 『root』 part for now: it will be explained later. The actual output can be formatted quite flexibly if you need that; formatting options will also be explained later.
輸出結果為:
如果你想每次都在一個新的日誌文件中寫日誌,那麼使用filemode='w'參數:
分別在main 函數里,在mylib.py里寫日誌
運行後的輸出:
以上代碼會顯示:
該 format參數的值
以上代碼會顯示:
還是該format:
以上代碼會輸出
如果想自己設定時間的格式:
會這樣顯示:
logging庫中用了模塊化的思路,把日誌的整體功能用了4個基本的模塊來完成:
Loggers,Handlers,Filters,Formatters
其中,Handlers,主要配置將信息寫到命令行,還是寫到文件里。
Filters,是對信息本身的過濾,決定那些信息不寫,那些信息寫。
Formatters決定信息輸出的格式。比如是否輸出時間,是否輸出logger本身的名字等,決定那些信息在前,那些信息在後等。
Logger就是Handler,Filter,Formatter配置的一個日誌對象了。
下面我們逐個說一下這4個類:
它有三個功能,1 提供分級日誌的輸出,比如 WARNING,ERROR,INFO等不同等級。2. 它可以決定哪些信息輸出,哪些信息不輸出。3 它可以將一條信息發給命令行和文件,可以把一條信息發給多個handler去處理。
logger 最常用的成員方法大概分兩類:配置和信息發送
以下是常用的配置函數:
Logger.setLevel() 設定信息記錄的等級。如果一條信息的等級比我們設定的低,那麼就不對此條信息進行處理。信息一共分為:DEBUG,INFO,WARNING,ERROR,CRITICAL 五個級別,其中DEBUG是最低的等級,CRITICAL是最高的等級。
Logger.addHandler() 和 Logger.removeHandler(),添加或者刪除信息處理器Handler。這個信息處理器就是定義了將日誌寫入命令行,還是寫入文件,或者寫入郵件等。
Logger.addFilter() 和 Logger.removeFilter() .添加或者刪除信息過濾器Filter。這個信息過濾器,決定了哪些信息不顯示。
可以看到,信息過濾器,信息處理器,信息等級共同配置了logger.
並不是每個logger你都需要去配置一遍,你可以利用logger的繼承機制,只配置父logger.
一旦配置好logger之後,就可以用以下函數來在你自己代碼的任意位置來記錄日誌了。
Logger.debug(),Logger.info(),Logger.warning(),Logger.error()和Logger.critical.這些函數的功能都是建立了日誌記錄信息,不同的是,函數名字就代表了其建立的日誌信息的等級。
Logger.exeception()建立一個與Logger.error()比較相似的信息。但是Logger.exception()是放入一個追蹤盞裡面的。所以,只有在exception handler處理器中,才能使用它。
Logger.log()發送一個LOG 等級的信息,使用LOG等級的信息稍微繁瑣些,因為使用LOG等級可以自定義等級。
getLogger() 返回一個logger的引用,如果指定了名字,那麼返回特定名字對應的logger,如果沒有指定名字,那就返回一個名字為root的loger的引用名字root,或者你指定的名字是一種級連結構。用同樣的名字去調用getLogger(),會得到同樣的值。logger的名字也決定了logger在樹結構中的層級。例如:這里有一個logger的名字為foo,那麼foo.bar,foo.bar.baz,還有foo.bam都是foo的子孫,logger還有一個有效等級level的概念。這個有效等級其實就是決定debug,info,warning等不同類型的消息是否進行記錄。因為logger本身有了父子那樣的繼承關系,所以有效等級level也是可以繼承的。如果子logger沒有設定了自身的level,那麼就把父logger的level繼承過來使用。如果子logger本身設定了level,就用自身這個level.如果父logger仍然沒有設定level,那就看父logger的父logger,一直這么追述下去,就會追述到root上,所以,我們必須給root設定一個level,或者默認一個level,方便root的子logger去繼承。我們給root設定的默認levle為WARNING.如果有些日誌的level,相比我們設定的WARNING低,那麼它就不會被傳遞給Handler去處理,就不會被列印出來,或者記錄進日誌文件。另外logger的屬性也是可繼承的,所以就只配置一下root logger即可,沒有root logger時,只用配置一個相對的那個根logger就行了
handler 信息處理器是負責信息分發給不同的目的地的,這個目的地可能是命令行,也可能是文件,或者郵件。分發時,同樣要檢查信息本身的等級severity.一個logger可以用addHandler()函數添加0個或者多個handlers。比如有這樣一個場景,希望發送所有的log等級的信息到一個log文件內。所有的等級為錯誤的信息到stdout 標准輸出上,發送所有的critical信息到郵件上。這樣的場景需要3個不同的處理器,每個處理器負責發送相應等級的信息到相應的目的地。
標准庫里包含一些處理器類型,本教程主要使用StreamHandler 和 FileHandler兩種信息處理器。
處理器中的成員函數非常少,我們用來配置處理器的成員函數大概有這個幾個:
setLevel(),用來設置處理器處理的信息等級。注意到logger中有setLevel(),而處理器中也有setLevel(),也就是說,logger把信息通過信息等級過濾一遍後,logger內的處理器需要根據處理器自身的功能設定,再根據信息等級來過濾一遍。
setFormatter() 為處理器設定一種信心記錄的格式Formatter
addFilter() removeFilter()函數添加信息過濾器或者刪除信息過濾器的函數。
到這里,我們發現,logger類中,將信息發送到不同的目的地就依賴Handlers實現的,
所有Handler就需要用Formatter和Filter來配置一下。接下來,我們看看Formatter和Filter.
它決定了信息顯示的順序,結構和內容。可以直接操作formatter的相關類,也可以自己繼承 formatter類,去完成自己的設定。formatter的構造函數需要3個可選的參數:字元串格式的信息,日期,一個符號。
logging.Formatter.__init__(fmt=None,datafmt=None,style='%')
如果這里沒有設定參數,就使用默認參數。對於fmt來說,就顯示原來信息,對於datafmt來說,就以年-月-日 時:分:秒的合適顯示。
下面的fmt就定義了一個按照 時間-信息等級-信息本身 來記錄日誌的方法:
這里有三種方法:
寫代碼配置logging的例子:
運行結果為:
寫配置文件配置logging的例子:
代碼中所需要的配置文件ogging.conf的具體內容為 :
以上代碼的輸出為:
顯然,配置文件修改起來相對容易很多。
還有更方便的配置方式,使用字典來配置:
運行結果與上面一樣。
到這里,基本完成了logging庫的比較常用的使用方式。
比如在什麼情況下,需要使用一個什麼都不做的處理器NullHandler(),
還有關於信息等級的更詳細的解釋:
以及如何自定義信息等級。
還有關於異常的處理
還有關於信息的,信息都是字元串的。不過你也可以直接把某個類作為信息拋出來,因為類會自動調用其__str__()函數,返回一個類的字元串回來。
還有就是優化性能的一些小技巧
這里就編寫expensive_func1 和 expensive_func2 來完成設定數據格式。
以下表格也顯示了如何收集運行log的代碼文件信息,線程信息,進程信息,處理器信息
以及如何操作才能收集代碼文件信息,線程信息,進程信息,以及處理器信息。
我們一般會使用收集代碼文件,線程,進程等信息,因為這樣大大方便了多線程多進程工程的調試。
⑤ 如何在gdb調試中列印出整個鏈表的節點
如何在gdb調試中列印出整個鏈表的節點
重新編譯gdb,讓gdb支持python插件
然後去下載python-gdb插件,配置.gdbint,就可以列印標准庫容器了
⑥ C++調用python模塊
這個問題比較復雜,有可能是你的python文件路徑不對或者是使用的C編譯器與編譯mole時使用的編譯器不一致。一般py文件可以放在程序運行目錄下或者PYTHON\lib目錄下。
⑦ 如何使用linux下gdb來調試python程序
gdb是用來調試二進製程序的,不能調試python腳本。
python自帶pdb模塊,可以用來調試自己的腳本。
使用python -m pdb <腳本.py>,交互方式,命令與gdb類似。
⑧ python如何一步步調試
裝個Pycharm
1 添加斷點
2 Debug下運行代碼:
3 F8:進行下一步操作
F7 :跳入下一個方法中
⑨ 如何編譯可以在Windows下運行的帶有Python支持的ARM Linux GDB
做這件事情的目的是為了在QtCreator里調試ARM Linux程序的時候,能看清楚QString、QList這些Qt特有的對象的內容,而不是一個完全看不懂的結構體。
目前(2014年8月)Linaro、CodeSourcery的GCC工具鏈里的GDB都不支持Python。想知道你用的GDB支持不支持,試一試就行,這樣表示不支持:
(gdb) python
>print 'Hello GDB!'
>(按Ctrl+D)Python scripting is not supported in this of GDB.
這樣表示支持:
(gdb) python
>print 'Hello GDB!'
>(按Ctrl+D)Hello GDB!
這件事情乍一看也很簡單,只要把GDB源碼下載下來,然後再配置,打開Python支持就行了。實際上會遇到的問題是,在MinGW下,又要與「\」和「:」這兩個Windows路徑里的刺頭斗爭了。我覺得我之前挺傻,編譯MinGW下Qt的時候,就去硬磕源碼和configure腳本去了。這次GDB的configure是自動生成的,不是給人看的,configure.ac看起來也很費勁,根本磕不下去,於是我換了個思路,在ubuntu下交叉編譯吧,sudo apt-get install mingw32,這是Ubuntu下的MinGW交叉編譯器。
然後是依賴,這樣的GDB要依賴expat和python的開發版本。如果是ubuntu底下直接編譯,apt-cache search一下他們的開發版本,然後sudo apt-get install一下就好了;給MinGW交叉編譯就麻煩了。先說expat,這個好辦,把http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz下載下來,然後:
./configure --prefix=[安裝目錄,如/home/c/mingw-gdb/expat] --host=i586-mingw32msvc
make
make install
會提示一些警告,無視即可。
Python就無語了,目前的GDB貌似最高支持Python 2.7,而2.7版本的Python本身不支持MinGW…… 好在有高手做了Patch,也寫了說明,可以參考這文章:http://mdqinc.com/blog/2011/10/cross-compiling-python-for-windows-with-mingw32/
但是,就算這樣,編譯也充滿挑戰,要修復很多問題,出來的Python還少「nt」模塊。就在我覺得沒辦法的時候,突然發現Windows版Qt提供的MinGW居然內置了Python開發包,位置在Tools/mingw48_32/opt,趕緊把它拷貝到Linux下,比如/home/c/mingw-gdb/python。當然,你也必須確保ubuntu下有可用的python。
然後,給GDB打一個補丁:
--- gdb-7.8/gdb/configure 2014-07-29 20:37:42.000000000 +0800
+++ gdb-7.8-old/gdb/configure 2014-08-30 00:08:27.122042706 +0800
@@ -8263,21 +8263,22 @@
# We have a python program to use, but it may be too old.
# Don't flag an error for --with-python=auto (the default).
have_python_config=yes
- python_includes=`${python_prog} ${srcdir}/python/python-config.py --includes`
+ python_config_tool=`echo ${python_prog} | sed "s#python.exe#python-config#g"`
+ python_includes=`${python_config_tool} --includes`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
as_fn_error "failure running python-config --includes" "$LINENO" 5
fi
fi
- python_libs=`${python_prog} ${srcdir}/python/python-config.py --ldflags`
+ python_libs=`${python_config_tool} --ldflags`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
as_fn_error "failure running python-config --ldflags" "$LINENO" 5
fi
fi
- python_prefix=`${python_prog} ${srcdir}/python/python-config.py --exec-prefix`
+ python_prefix=`${python_config_tool} --exec-prefix`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
@@ -8343,12 +8344,12 @@
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+#if ac_fn_c_try_link "$LINENO"; then :
have_libpython=${version}
found_usable_python=yes
PYTHON_CPPFLAGS=$new_CPPFLAGS
PYTHON_LIBS=$new_LIBS
-fi
+#fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
CPPFLAGS=$save_CPPFLAGS
這個補丁的目的是強制為檢測到python。
然後給拷貝到Linux下的python開發包打一個補丁:
--- python-old/bin/python-config 2013-04-18 02:43:01.000000000 +0800
+++ python/bin/python-config 2014-08-30 00:53:16.630060288 +0800
@@ -1,4 +1,4 @@
-#!/temp/x32-480-posix-dwarf-r2/mingw32/opt/bin/python2.7.exe
+#!/usr/bin/python
import sys
import os
@@ -31,26 +31,23 @@
for opt in opt_flags:
if opt == '--prefix':
- print sysconfig.PREFIX
+ print '../python'
elif opt == '--exec-prefix':
- print sysconfig.EXEC_PREFIX
+ print '../python'
elif opt in ('--includes', '--cflags'):
- flags = ['-I' + sysconfig.get_python_inc(),
- '-I' + sysconfig.get_python_inc(plat_specific=True)]
+ flags = ['-I' + os.path.split(os.path.realpath(__file__))[0] + '/../include/python2.7']
if opt == '--cflags':
- flags.extend(getvar('CFLAGS').split())
+ flags += ['-fno-strict-aliasing -DMS_WIN32 -DMS_WINDOWS -DHAVE_USABLE_WCHAR_T -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes']
print ' '.join(flags)
elif opt in ('--libs', '--ldflags'):
- libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
- libs.append('-lpython'+pyver)
+ libs = ['-lm -lpython2.7 -Wl,--out-implib=libpython2.7.dll.a']
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
# shared library in prefix/lib/.
if opt == '--ldflags':
if not getvar('Py_ENABLE_SHARED'):
- libs.insert(0, '-L' + getvar('LIBPL'))
- libs.extend(getvar('LINKFORSHARED').split())
+ libs.insert(0, '-L' + os.path.split(os.path.realpath(__file__))[0] + '/../lib/python2.7/config')
print ' '.join(libs)
因為Linux下是無法運行開發包中的python.exe的,所以這個補丁借用了ubuntu的python。裡面的cflags和ldflags都是在Windows底下運行原始python-config獲得的。prefix和exec-prefix設成「../python」,可以在編譯完以後,把python開發包拷貝到gdb安裝目錄裡面的python子目錄,這樣運行GDB的時候就不需要設定PYTHONHOME環境變數了。
最後一個事情,確保你的Linux下有arm交叉編譯器,我的是arm-linux-gnueabihf,是啥target就寫啥。
准備工作做完了,開始配置和編譯:
./configure --with-expat --host=i586-mingw32msvc --target=arm-linux-gnueabihf --with-libexpat-prefix=[expat安裝位置] --with-python=[python開發包安裝位置/bin/python.exe]
make
make DESTDIR=[GDB安裝位置] install
然後把GDB安裝位置下面的所有文件拷貝到Windows下,再把python開發包拷貝到同目錄下的python子目錄,大功告成。
如果提示沒找到libpython2.7.dll,那就把GDB安裝目錄的python/bin下的拷貝到bin下。
如果發現生成的exe文件太大了,那就strip一下。
2015年9月12日追加:
在windows下調試時,一般會提示說載入不了共享庫,讓你用"set sysroot"或"set solib-search-path"之類設定路徑的。這個問題可以通過.gdbinit文件,用上面這兩條命令來設定路徑解決,如果想一勞永逸,可以在編譯的時候加上host_configargs環境變數來解決這個問題:
host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm ./configure ...
或者
export host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm
./configure ...
後面的路徑是放在windows下的sysroot的位置。
⑩ 如何調試Python的segmentation fault錯誤
錯誤
一般都是非法內存操作,例如數組越界,例如申請a[5],卻訪問到a[5]或者a[6],這也會有很多情況,可能是循環操作時循環變數控制有問題,可能是字元串拷貝時長度發生溢出
指針指向了非法內存,例如申明一個指針,但是沒有對指針進行初始化,直接就引用,或者引用裡面的元素或者函數,或者沒有分配內存就進行釋放等,另外,申請內存還要檢查是否申請成功,如果沒有申請成功也會出現這種情況
單步調試或者加列印信息,細心一點總可以找到錯誤的,注意編譯成調試版本 如果是linux,可以產生core文件,從core文件查看出錯的地方