免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
本次游戲沒法給
內容參考于:微塵網絡安全
上一個內容:11.第二階段x64游戲實戰-框架代碼細節優化
本次寫的內容是關于調試、排錯相關的,在寫代碼的過程中肯定會遇到問題,不可能會一帆風順
比如說注入我們寫的dll之后游戲就會崩潰或者點擊按鈕之后會崩潰,這要怎么解決問題?怎么找出問題在哪,比如有人寫了代碼會讓游戲崩潰,然后跑過來跟我說游戲崩潰,我根本不知道你說的是什么,正確的是找到問題,比如這行代碼怎么怎么報錯了怎么怎么不行,就要把問題的細節描述出來
首先是注入就崩潰,這是什么情況?
關于注入就崩潰這個問題,首先要搞清楚代碼執行的流程,就是說我們的dll一注入進去會發生什么情況,從哪里開始執行,如下圖紅框MFCdll一注入進去會從以項目名字命名的.cpp文件開始
![]()
從InitInstance函數開始執行
![]()
所以一注入就崩潰可以寫打印日志的代碼,如下圖紅框的代碼是用來打印日志
![]()
然后如下圖紅框就在InitInstance函數中調用LogA函數,打印日志,這樣可以看到執行到哪一行,導致的崩潰,如果打印了1111沒打印2222就說明73行代碼報錯了,這樣就定位到錯誤的代碼了,就是看它執行到那了該有的日志有沒有打印出來
![]()
查看日志的方式是通過Dbgview這個軟件,打開之后點擊下圖紅框位置,包含寫的*說明所有日志都打印,包含它還可以AAA*這樣就只打印內容以AAA開頭的數據,排除寫的1;2;3說明只要日志的內容包含1或2或3就不顯示
![]()
現在的日志代碼正常執行它會打印1111、2222、3333、4444
![]()
注入打印的內容,為什么沒打印4444?因為 PMainDialog->DoModal(); 這個代碼是一個模態窗口,代碼會在它這一行卡主后面不會執行,只有把窗口關閉了才會打印4444
![]()
關閉窗口打印4444,通過這些步驟的打印就可以清楚的知道代碼執行的流程,也就能知道注入就崩潰是哪一行代碼引起的
![]()
注入不崩潰點擊按鈕這種的崩潰怎么辦?
也是跟上方注入崩潰一樣,找到按鈕點擊之后執行的函數,把每一行都加上LogA,看看執行了哪一行代碼導致了崩潰
如果不想用上面的方式可以使用 Visual Studio 2022 提供的附加,如下圖點擊附加到進程
然后如下圖搜索進程名,找到想要附加的進程
鼠標左鍵單機進程,然后點附加
附加之后的樣子
然后在入口位置設置斷點,如下圖紅框
然后使用注入器注入我們的dll文件,然后就可以觸發我們設置的斷點了
它是可以直接看得到每個變量內存的數據的,可以很方便的看崩潰的原因 ,比較好用,但是有些有檢測的軟件沒法使用,到時候還是要用LogA的方式