麟系統(tǒng)開(kāi)發(fā)筆記(十):在國(guó)產(chǎn)麒麟系統(tǒng)上使用gdb定位崩潰異常方法流程以及測(cè)試Demo
前言
??本篇就適合代碼崩潰的方法,可以定位到代碼崩潰原因,測(cè)試Demo。
使用gdb定位Qt的release(國(guó)產(chǎn)麒麟系統(tǒng))
步驟一:新建立一個(gè)簡(jiǎn)單的應(yīng)用
??

步驟二:造崩潰代碼
DumpWidget::DumpWidget(QWidget *parent) :
? ?QMainWindow(parent),
? ?ui(new Ui::DumpWidget),
? ?_pTimer(0){
? ?ui->setupUi(this);
? ?LOG << _pTimer;#if 0
? ?if(!_pTimer)
? ?{
? ? ? ?_pTimer = new QTimer(this);
? ?}#endif
? ?LOG << _pTimer;
? ?connect(_pTimer, SIGNAL(timeout()), this, SLOT(slot_timeout()));
? ?LOG << _pTimer;
? ?_pTimer->setInterval(1000);LOG << _pTimer;}
??

步驟三:運(yùn)行崩潰
??

步驟四:為了更好的看到效果,加3s延遲
??

??

??

步驟五:定位到coredump文件
??默認(rèn)目錄/var/lib/system/coredump
??

??沒(méi)有,怎么弄國(guó)產(chǎn)麒麟系統(tǒng)都不會(huì)有得,因?yàn)樯稍?tmp目錄下了,查看“入坑一”:
??

步驟六:定位位置
??

??因?yàn)镈emo堆棧不多,就一層,所以很容易定位,而實(shí)際程序可能達(dá)到幾兆,幾十兆,幾百兆甚至1~2個(gè)GB。
??這里為了再次確認(rèn),gdb調(diào)試release版本沒(méi)有添加任何額外pro語(yǔ)句嘗試了一次:
??

??(注意:不知道ubuntu是否這樣可以,目前通過(guò)其他方法都需要加g或者qmake,這個(gè)持保留意見(jiàn),后續(xù)進(jìn)一步了解再補(bǔ)充了)
??(注意:后續(xù)通過(guò)“模擬實(shí)戰(zhàn)”,發(fā)現(xiàn)能定位給到錯(cuò)誤的函數(shù),但是沒(méi)有行號(hào)。)
模擬實(shí)戰(zhàn)
??先加了一句代碼:
??

??運(yùn)行崩潰:
??

??定位coredump文件:
??

??然后使用gdb的方法:
??

??

??定位不到,這個(gè)時(shí)候再按一下回車(chē):
??

(注意:發(fā)現(xiàn)能定位給到錯(cuò)誤的函數(shù),但是沒(méi)有行號(hào)。)
現(xiàn)場(chǎng)另外一種情況
??

??這個(gè)情況結(jié)合很早之前烤機(jī)的bug,QDateTime::currentDataTime().toString(“yyyy-MM-dd hh:mm:ss:zzz”)出現(xiàn)亂碼,跑起來(lái)偶爾出現(xiàn)亂碼,就會(huì)一直亂碼,啟動(dòng)非亂碼則非亂碼,這個(gè)是qt和麒麟的兼容性問(wèn)題,后續(xù)再議。
入坑
入坑一:沒(méi)有生成coredump文件
問(wèn)題
??默認(rèn)目錄/var/lib/system/coredump,目錄為空,試了其他方法也不行。
原理
??默認(rèn)生成在了/tmp目錄下了,而不是coredump目錄下。
??使用其他ulimit -c unlimited也不會(huì),國(guó)產(chǎn)麒麟系統(tǒng)是對(duì)系統(tǒng)很多默認(rèn)配置和路徑做了強(qiáng)制修改的。
解決
??默認(rèn)生成在了/tmp目錄下了
??
