本技術(shù)涉及軟件調(diào)試,特別涉及一種?;厮莘椒?、裝置、設(shè)備、存儲(chǔ)介質(zhì)及程序產(chǎn)品。
背景技術(shù):
1、在精簡(jiǎn)指令集計(jì)算機(jī)(reduced?instruction?set?computer,risc)架構(gòu)中,程序執(zhí)行過(guò)程中會(huì)發(fā)生中斷,此時(shí)需要立即中斷當(dāng)前的程序執(zhí)行流,轉(zhuǎn)而調(diào)用中斷處理函數(shù)來(lái)處理中斷,處理結(jié)束后退出執(zhí)行中斷處理函數(shù),返回繼續(xù)執(zhí)行原程序。其中,risc架構(gòu)可以是risc-v架構(gòu),v表示為第五代risc。
2、程序在執(zhí)行過(guò)程中會(huì)通過(guò)堆棧來(lái)記錄函數(shù)調(diào)用路徑,例如,堆棧中可以包括多個(gè)棧幀,每個(gè)棧幀是為每次函數(shù)調(diào)用分配的內(nèi)存塊,用于存儲(chǔ)調(diào)用的函數(shù)的參數(shù)、返回地址等信息,在退出執(zhí)行函數(shù)后刪除對(duì)應(yīng)的棧幀。通過(guò)從堆棧的棧頂向棧底的回溯,能夠從當(dāng)前執(zhí)行點(diǎn)追溯回到程序的執(zhí)行起點(diǎn),進(jìn)而通過(guò)分析程序執(zhí)行過(guò)程的函數(shù)調(diào)用路徑可以定位程序錯(cuò)誤,該過(guò)程即為?;厮?stack?trace)。
3、相關(guān)技術(shù)中,使用gdb(gnu?debugger,gnu調(diào)試器)的?;厮莨δ埽ㄟ^(guò)進(jìn)入調(diào)試模式對(duì)堆棧中的各個(gè)棧幀進(jìn)行?;厮荩玫降臈;厮菪畔ǜ鱾€(gè)調(diào)用的函數(shù)的返回地址,通過(guò)各個(gè)返回地址能夠分析出程序執(zhí)行過(guò)程的函數(shù)調(diào)用路徑。其中,gnu是一種操作系統(tǒng)。
4、但是,由于中斷處理函數(shù)在退出執(zhí)行后,堆棧中不再包括中斷處理函數(shù)的棧幀,使得使用gdb對(duì)堆棧進(jìn)行棧回溯的方法缺少對(duì)中斷處理函數(shù)的回溯,導(dǎo)致棧回溯信息不完整。
技術(shù)實(shí)現(xiàn)思路
1、本技術(shù)提供了一種棧回溯方法、裝置、設(shè)備、存儲(chǔ)介質(zhì)及程序產(chǎn)品,能夠解決相關(guān)技術(shù)中的問(wèn)題。
2、第一方面,提供一種?;厮莘椒ǎ龇椒òǎ涸趫?zhí)行程序的過(guò)程中,獲取中斷索引數(shù)組,所述中斷索引數(shù)組包括執(zhí)行的中斷處理函數(shù)的中斷地址,所述中斷處理函數(shù)是在所述程序發(fā)生中斷的情況下調(diào)用的函數(shù),所述中斷地址指示所述發(fā)生中斷的指令的下一條指令的地址;
3、在執(zhí)行的所述程序滿(mǎn)足?;厮輻l件的情況下,獲取函數(shù)返回地址數(shù)組,所述函數(shù)返回地址數(shù)組包括執(zhí)行的程序函數(shù)的返回地址,所述程序函數(shù)是所述程序在正常執(zhí)行過(guò)程中的指令調(diào)用的函數(shù);
4、基于所述中斷索引數(shù)組和所述函數(shù)返回地址數(shù)組獲取?;厮菪畔?,所述?;厮菪畔ㄋ龀绦驁?zhí)行過(guò)程中的程序函數(shù)之間的調(diào)用關(guān)系以及所述發(fā)生中斷的程序函數(shù)的位置。
5、在一種可能的實(shí)施方式中,所述方法還包括:在執(zhí)行所述程序的過(guò)程中,獲取中斷函數(shù)地址數(shù)組,所述中斷函數(shù)地址數(shù)組包括執(zhí)行的中斷處理函數(shù)的入口地址;所述基于所述中斷索引數(shù)組和所述函數(shù)返回地址數(shù)組獲取?;厮菪畔ⅲǎ夯谒鲋袛嗨饕龜?shù)組、所述函數(shù)返回地址數(shù)組和所述中斷函數(shù)地址數(shù)組獲取?;厮菪畔ⅲ鰲;厮菪畔⑦€包括所述發(fā)生中斷的程序函數(shù)與中斷處理函數(shù)的調(diào)用關(guān)系。
6、在一種可能的實(shí)施方式中,所述函數(shù)返回地址數(shù)組中的返回地址的前后關(guān)系指示所述程序函數(shù)之間的調(diào)用關(guān)系;所述基于所述中斷索引數(shù)組、所述函數(shù)返回地址數(shù)組和所述中斷函數(shù)地址數(shù)組獲取?;厮菪畔ⅲǎ簩⑺鲋袛嗨饕龜?shù)組中的中斷地址排列到所述函數(shù)返回地址數(shù)組中,得到排序后的地址數(shù)組,所述排序后的地址數(shù)組中屬于所述中斷索引數(shù)組的中斷地址的排列位置指示所述發(fā)生中斷的程序函數(shù)的位置;將所述排序后的地址數(shù)組中屬于所述中斷索引數(shù)組的中斷地址,替換為所述中斷函數(shù)地址數(shù)組中的入口地址,得到替換后的地址數(shù)組,所述替換后的地址數(shù)組中的返回地址與入口地址的前后關(guān)系指示所述發(fā)生中斷的程序函數(shù)與中斷處理函數(shù)的調(diào)用關(guān)系;將所述替換后的地址數(shù)組作為所述?;厮菪畔?。
7、在一種可能的實(shí)施方式中,所述獲取函數(shù)返回地址數(shù)組,包括:確定執(zhí)行的所述程序位于的第一函數(shù)的函數(shù)類(lèi)型,按照所述第一函數(shù)的函數(shù)類(lèi)型獲取所述第一函數(shù)的返回地址;將所述第一函數(shù)的返回地址保存到所述函數(shù)返回地址數(shù)組中;在達(dá)到終止條件的情況下,得到所述函數(shù)返回地址數(shù)組。
8、在一種可能的實(shí)施方式中,所述將所述第一函數(shù)的返回地址保存到所述函數(shù)返回地址數(shù)組中之后,還包括:在未達(dá)到所述終止條件的情況下,確定調(diào)用所述第一函數(shù)的第二函數(shù)的函數(shù)類(lèi)型,按照所述第二函數(shù)的函數(shù)類(lèi)型獲取所述第二函數(shù)的返回地址;將所述第二函數(shù)的返回地址保存到所述函數(shù)返回地址數(shù)組中;在達(dá)到所述終止條件的情況下,得到所述函數(shù)返回地址數(shù)組。
9、在一種可能的實(shí)施方式中,所述確定執(zhí)行的所述程序位于的第一函數(shù)的函數(shù)類(lèi)型,包括:在中斷發(fā)生次數(shù)大于參考值的情況下,確定所述第一函數(shù)的函數(shù)類(lèi)型為中斷處理函數(shù),其中,所述中斷發(fā)生次數(shù)在進(jìn)入執(zhí)行所述中斷處理函數(shù)的情況下加第一值,在退出執(zhí)行所述中斷處理函數(shù)的情況下減所述第一值;在所述中斷發(fā)生次數(shù)等于參考值的情況下,若基于所述程序的幀指針獲取的返回地址與所述程序的返回地址寄存器中的返回地址不一致,確定所述第一函數(shù)的函數(shù)類(lèi)型為葉子函數(shù);若基于所述幀指針獲取的返回地址與所述返回地址寄存器中的返回地址一致,確定所述第一函數(shù)的函數(shù)類(lèi)型為非葉子函數(shù)。
10、在一種可能的實(shí)施方式中,所述按照所述第一函數(shù)的函數(shù)類(lèi)型獲取所述第一函數(shù)的返回地址,包括:在所述第一函數(shù)的函數(shù)類(lèi)型為中斷處理函數(shù)或非葉子函數(shù)的情況下,將基于所述程序的幀指針獲取的返回地址作為所述第一函數(shù)的返回地址,所述幀指針指向所述第一函數(shù)的棧幀基址。
11、在一種可能的實(shí)施方式中,所述將所述第一函數(shù)的返回地址保存到所述函數(shù)返回地址數(shù)組中之后,還包括:基于所述中斷處理函數(shù)或所述非葉子函數(shù)獲取所述幀指針對(duì)應(yīng)的棧指針的值,將所述棧指針的值賦值給所述幀指針,以使賦值后的幀指針指向調(diào)用所述第一函數(shù)的第二函數(shù)的棧幀基址,所述賦值后的幀指針用于確定所述第二函數(shù)的函數(shù)類(lèi)型。
12、在一種可能的實(shí)施方式中,所述按照所述第一函數(shù)的函數(shù)類(lèi)型獲取所述第一函數(shù)的返回地址,包括:在所述第一函數(shù)的函數(shù)類(lèi)型為葉子函數(shù)的情況下,基于所述葉子函數(shù)獲取所述幀指針對(duì)應(yīng)的棧指針的值,將所述棧指針的賦值給所述幀指針,以使賦值后的幀指針指向調(diào)用所述第一函數(shù)的非葉子函數(shù)的棧幀基址;將所述程序的返回地址寄存器中的返回地址和基于所述賦值后的幀指針獲取的返回地址作為所述第一函數(shù)的返回地址。
13、在一種可能的實(shí)施方式中,所述將所述第一函數(shù)的返回地址保存到所述函數(shù)返回地址數(shù)組中之后,還包括:基于所述非葉子函數(shù)獲取所述賦值后的幀指針對(duì)應(yīng)的棧指針的值,將所述棧指針的值賦值給所述賦值后的幀指針,以使再次賦值后的幀指針指向調(diào)用所述非葉子函數(shù)的第二函數(shù)的棧幀基址,所述再次賦值后的幀指針用于確定所述第二函數(shù)的函數(shù)類(lèi)型。
14、在一種可能的實(shí)施方式中,所述終止條件為滿(mǎn)足如下三個(gè)條件中的任一個(gè);條件一:保存到所述函數(shù)返回地址數(shù)組中的返回地址的值為0;條件二:基于幀指針獲取的棧指針的值大于或者等于程序棧頂?shù)闹担粭l件三:?;厮荽螖?shù)大于棧回溯深度,所述棧回溯深度指示允許的最大?;厮荽螖?shù),其中,所述?;厮荽螖?shù)在所述函數(shù)返回地址數(shù)組保存一個(gè)返回地址的情況下加第二值。
15、第二方面,提供了一種?;厮菅b置,所述裝置包括:
16、第一獲取模塊,用于在執(zhí)行程序的過(guò)程中,獲取中斷索引數(shù)組,所述中斷索引數(shù)組包括執(zhí)行的中斷處理函數(shù)的中斷地址,所述中斷處理函數(shù)是在所述程序發(fā)生中斷的情況下調(diào)用的函數(shù),所述中斷地址指示所述發(fā)生中斷的指令的下一條指令的地址;
17、第二獲取模塊,用于在執(zhí)行的所述程序滿(mǎn)足?;厮輻l件的情況下,獲取函數(shù)返回地址數(shù)組,所述函數(shù)返回地址數(shù)組包括執(zhí)行的程序函數(shù)的返回地址,所述程序函數(shù)是所述程序在正常執(zhí)行過(guò)程中的指令調(diào)用的函數(shù);
18、第三獲取模塊,用于基于所述中斷索引數(shù)組和所述函數(shù)返回地址數(shù)組獲取?;厮菪畔?,所述?;厮菪畔ㄋ龀绦驁?zhí)行過(guò)程中的程序函數(shù)之間的調(diào)用關(guān)系以及所述發(fā)生中斷的程序函數(shù)的位置。
19、在一種可能的實(shí)施方式中,所述第二獲取模塊,還用于在執(zhí)行所述程序的過(guò)程中,獲取中斷函數(shù)地址數(shù)組,所述中斷函數(shù)地址數(shù)組包括執(zhí)行的中斷處理函數(shù)的入口地址;所述第三獲取模塊,用于基于所述中斷索引數(shù)組、所述函數(shù)返回地址數(shù)組和所述中斷函數(shù)地址數(shù)組獲取棧回溯信息,所述?;厮菪畔⑦€包括所述發(fā)生中斷的程序函數(shù)與中斷處理函數(shù)的調(diào)用關(guān)系。
20、在一種可能的實(shí)施方式中,所述函數(shù)返回地址數(shù)組中的返回地址的前后關(guān)系指示所述程序函數(shù)之間的調(diào)用關(guān)系;所述第三獲取模塊,用于將所述中斷索引數(shù)組中的中斷地址排列到所述函數(shù)返回地址數(shù)組中,得到排序后的地址數(shù)組,所述排序后的地址數(shù)組中屬于所述中斷索引數(shù)組的中斷地址的排列位置指示所述發(fā)生中斷的程序函數(shù)的位置;將所述排序后的地址數(shù)組中屬于所述中斷索引數(shù)組的中斷地址,替換為所述中斷函數(shù)地址數(shù)組中的入口地址,得到替換后的地址數(shù)組,所述替換后的地址數(shù)組中的返回地址與入口地址的前后關(guān)系指示所述發(fā)生中斷的程序函數(shù)與中斷處理函數(shù)的調(diào)用關(guān)系;將所述替換后的地址數(shù)組作為所述?;厮菪畔ⅰ?/p>
21、在一種可能的實(shí)施方式中,所述第二獲取模塊,用于確定執(zhí)行的程序位于的第一函數(shù)的函數(shù)類(lèi)型,按照所述第一函數(shù)的函數(shù)類(lèi)型獲取所述第一函數(shù)的返回地址;將所述第一函數(shù)的返回地址保存到所述函數(shù)返回地址數(shù)組中;在達(dá)到終止條件的情況下,得到所述函數(shù)返回地址數(shù)組。
22、在一種可能的實(shí)施方式中,所述第二獲取模塊,還用于在未達(dá)到所述終止條件的情況下,確定調(diào)用所述第一函數(shù)的第二函數(shù)的函數(shù)類(lèi)型,按照所述第二函數(shù)的函數(shù)類(lèi)型獲取所述第二函數(shù)的返回地址;將所述第二函數(shù)的返回地址保存到所述函數(shù)返回地址數(shù)組中;在達(dá)到所述終止條件的情況下,得到所述函數(shù)返回地址數(shù)組。
23、在一種可能的實(shí)施方式中,所述第二獲取模塊,用于在中斷發(fā)生次數(shù)大于參考值的情況下,確定所述第一函數(shù)的函數(shù)類(lèi)型為中斷處理函數(shù),其中,所述中斷發(fā)生次數(shù)在進(jìn)入執(zhí)行所述中斷處理函數(shù)的情況下加第一值,在退出執(zhí)行所述中斷處理函數(shù)的情況下減所述第一值;在所述中斷發(fā)生次數(shù)等于參考值的情況下,若基于所述程序的幀指針獲取的返回地址與所述程序的返回地址寄存器中的返回地址不一致,確定所述第一函數(shù)的函數(shù)類(lèi)型為葉子函數(shù);若基于所述幀指針獲取的返回地址與所述返回地址寄存器中的返回地址一致,確定所述第一函數(shù)的函數(shù)類(lèi)型為非葉子函數(shù)。
24、在一種可能的實(shí)施方式中,所述第二獲取模塊,用于在所述第一函數(shù)的函數(shù)類(lèi)型為中斷處理函數(shù)或非葉子函數(shù)的情況下,將基于所述程序的幀指針獲取的返回地址作為所述第一函數(shù)的返回地址,所述幀指針指向所述第一函數(shù)的棧幀基址。
25、在一種可能的實(shí)施方式中,所述第二獲取模塊,還用于基于所述中斷處理函數(shù)或所述非葉子函數(shù)獲取所述幀指針對(duì)應(yīng)的棧指針的值,將所述棧指針的值賦值給所述幀指針,以使賦值后的幀指針指向調(diào)用所述第一函數(shù)的第二函數(shù)的棧幀基址,所述賦值后的幀指針用于確定所述第二函數(shù)的函數(shù)類(lèi)型。
26、在一種可能的實(shí)施方式中,所述第二獲取模塊,用于在所述第一函數(shù)的函數(shù)類(lèi)型為葉子函數(shù)的情況下,基于所述葉子函數(shù)獲取所述幀指針對(duì)應(yīng)的棧指針的值,將所述棧指針的賦值給所述幀指針,以使賦值后的幀指針指向調(diào)用所述第一函數(shù)的非葉子函數(shù)的棧幀基址;將所述程序的返回地址寄存器中的返回地址和基于所述賦值后的幀指針獲取的返回地址作為所述第一函數(shù)的返回地址。
27、在一種可能的實(shí)施方式中,所述第二獲取模塊,還用于基于所述非葉子函數(shù)獲取所述賦值后的幀指針對(duì)應(yīng)的棧指針的值,將所述棧指針的值賦值給所述賦值后的幀指針,以使再次賦值后的幀指針指向調(diào)用所述非葉子函數(shù)的第二函數(shù)的棧幀基址,所述再次賦值后的幀指針用于確定所述第二函數(shù)的函數(shù)類(lèi)型。
28、在一種可能的實(shí)施方式中,所述終止條件為滿(mǎn)足如下三個(gè)條件中的任一個(gè);條件一:保存到所述函數(shù)返回地址數(shù)組中的返回地址的值為0;條件二:基于幀指針獲取的棧指針的值大于或者等于程序棧頂?shù)闹?;條件三:?;厮荽螖?shù)大于?;厮萆疃龋鰲;厮萆疃戎甘驹试S的最大棧回溯次數(shù),其中,所述?;厮荽螖?shù)在所述函數(shù)返回地址數(shù)組保存一個(gè)返回地址的情況下加第二值。
29、在一種可能的實(shí)施方式中,該棧回溯裝置具有實(shí)現(xiàn)上述方面提供的方法實(shí)施例中行為的功能。該棧回溯裝置可以是設(shè)備,也可以是設(shè)備的部件(例如處理器、芯片、或芯片系統(tǒng)等),還可以是能實(shí)現(xiàn)全部或部分該通信設(shè)備的功能的邏輯模塊或軟件。該棧回溯裝置的功能可以通過(guò)硬件實(shí)現(xiàn),也可以通過(guò)硬件執(zhí)行相應(yīng)的軟件實(shí)現(xiàn),該硬件或軟件包括一個(gè)或多個(gè)與上述功能相對(duì)應(yīng)的模塊或單元。
30、第三方面,還提供了一種計(jì)算機(jī)設(shè)備,所述計(jì)算機(jī)設(shè)備包括處理器和存儲(chǔ)器,所述存儲(chǔ)器中存儲(chǔ)有至少一條程序代碼,所述至少一條程序代碼由所述處理器加載并執(zhí)行,以使計(jì)算機(jī)設(shè)備實(shí)現(xiàn)上述任一項(xiàng)所述的?;厮莘椒?。
31、第四方面,還提供了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中存儲(chǔ)有至少一條程序代碼,所述至少一條程序代碼由處理器加載并執(zhí)行,以使計(jì)算機(jī)實(shí)現(xiàn)上述任一項(xiàng)所述的棧回溯方法。
32、第五方面,還提供了一種計(jì)算機(jī)程序產(chǎn)品或計(jì)算機(jī)程序,所述計(jì)算機(jī)程序產(chǎn)品或計(jì)算機(jī)程序包括計(jì)算機(jī)指令,所述計(jì)算機(jī)指令存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中。計(jì)算機(jī)設(shè)備的處理器從所述計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)讀取所述計(jì)算機(jī)指令,處理器執(zhí)行所述計(jì)算機(jī)指令,使得所述計(jì)算機(jī)設(shè)備執(zhí)行上述任一所述的棧回溯方法。
33、本技術(shù)提供的技術(shù)方案至少可以帶來(lái)如下有益效果:
34、本技術(shù)提供的技術(shù)方案,在執(zhí)行程序的過(guò)程中獲取中斷索引數(shù)組,中斷索引數(shù)組包括發(fā)生中斷的下一條指令的地址,使得根據(jù)中斷索引數(shù)組能夠在回溯出程序函數(shù)之間的調(diào)用關(guān)系的基礎(chǔ)上,還回溯出程序函數(shù)的哪些位置發(fā)生過(guò)中斷,不會(huì)造成中斷回溯信息的丟失,使得回溯信息更完整。此外,該方法通過(guò)是否滿(mǎn)足?;厮輻l件來(lái)自動(dòng)觸發(fā)獲取函數(shù)返回地址數(shù)組,即自動(dòng)觸發(fā)?;厮菪畔⒌墨@取,該過(guò)程無(wú)需通過(guò)硬件進(jìn)入到調(diào)試模式,使得在無(wú)法進(jìn)入調(diào)試模式的場(chǎng)景下能夠快速的獲取?;厮菪畔ⅰ?/p>