UE4 除錯技巧分享 (二)
上一篇介紹了兩個除錯小技巧 這一篇會比較著重在中斷點的部份。 技巧分享 這篇的複雜度稍高,而且技巧互相有關連,建議按照順序看。 環境 先稍微介紹一下本篇的環境。 開發平台的部分是Windows + Visual Studio 2017; 引擎是UE4.23。 照理說引擎版本沒什麼差,不過為了保險還是提一下。 從BP中斷點找出完整的Call Stack 在使用編輯器的時候,我們常常會使用BP中斷點來追查執行順序,如同C++的中斷點一樣。 但是如果這個事件是從C++來的話,在BlueprintDebugger是無法得知的,如下圖所示。 其實我們是有辦法知道的,在BP中斷點停住的狀態下,回去Visual Studio,假設UE4 process已經是attach的狀態,按Debug->BreakAll (如圖),這時候就可以看到Call Stack了。 通常CallStack分頁會看到一大串,好像很嚇人,這時候不要慌不要著急,看到Slate那種的都略過一直往下捲。慢慢的看你應該會找到認識的函式,如下圖所示。 以這張圖為例子,就可以知道BP的Tick是從C++的Actor::Tick內呼叫ReceiveTick來的。 有時候你會看到CallStack極短,長的像這樣: 這是因為斷點剛好停在別的Thread,這時候只要去Visual Studio的Debug->Windows->Threads將Thread分頁叫出,然後跳到MainThread就可以了。 從C++中斷點找出BP呼叫的來源 前一個技巧是BP斷點想知道從哪個C++呼叫進來的。這個技巧是要說明如何從C++斷點找出是哪個BP呼叫來的。這個技巧特別重要,因為就算是Packaged Game也可以抓出BP來源。 假設我現在中斷點停在C++的程式碼,有兩種方法可以試 方法1. 到Visual Studio的Watch視窗內輸入 {,,UE4Editor-Core}::PrintScriptCallstack() 或是 ::PrintScriptCallstack() Debug Editor的話則是輸入 {,,UE4Editor-Core-Win64-Debug}::PrintScriptCallstack() 然後去Visual Studio的Output視窗就會看到印出來的BP Call Stac