1. 程式人生 > >unity3D:IL2CPP 內部構建 – 生成程式碼的除錯技巧

unity3D:IL2CPP 內部構建 – 生成程式碼的除錯技巧

轉自:http://www.manew.com/thread-40379-1-1.html

在本文中,我們將探究一些程式碼除錯技巧,一些可以使IL2CPP生成的C++程式碼除錯更加容易的技巧。我們將瞭解如何設定斷點、檢視字串和使用者定義型別的內容、以及如何確定出現異常的位置。

  當我們接觸到這些內容時,應該正在除錯由.NET IL程式碼建立的生成C++程式碼,因此除錯過程有可能不那麼令人滿意。但是通過一些除錯技巧,便有可能透徹的理解unity專案程式碼如何在實際目標裝置上執行(我們會在文章的末尾討論一些有關除錯託管程式碼的內容)。

  同時,在專案中為生成程式碼做準備,以便其區別於該程式碼。通過Unity各個新版本,我們正在尋找一個方法使生成程式碼更好、更快、更小短。



設定

  在本文中,我在OSX系統上使用unity 5.0.1p3。使用和有關生成程式碼的文章中相同的示例專案,但是此次使用IL2CPP指令碼後端為iOS目標建立示例專案。如上篇文章所述,在選擇“Development Player”的情況下建立專案,這樣il2cpp.exe便會生成C++程式碼,且生成的型別名稱和方法名稱以IL程式碼中的名稱為基礎。

  Unity生成Xcode專案完成後,在Xcode中將其開啟(我的版本為6.3.1,任何更新版本都可使用),選擇目標裝置(iPad Mini 3,任何iOS裝置都可使用)並在Xcode中建立專案。

設定斷點

  執行專案之前,首先在HelloWorld中Start的頂部設定斷點。正如前一篇文章中所見,在生成的C++程式碼中該方法名稱為HelloWorld_Start_m3。我們可以使用Cmd+Shift+O並鍵入該方法名稱,以便在Xcode中查詢,然後在此處設定斷點。


 

  我們也可在Xcode中選擇Debug > Breakpoints > Create Symbolic Breakpoint,然後,用此方法設定斷點。

 

  現在當我執行Xcode專案時,可以立刻看到在該方法開始的時候中斷。

  如果我們知道方法名稱,則可在此類生成程式碼中用其他方法設定斷點。在Xcode中,也可在生成程式碼的某個檔案的具體行設定斷點。實際上所有的生成檔案都是Xcode專案的一部分。你可以在Classes/Native資料夾的Project Navigator中看到這些檔案。

 

檢視字串


  在Xcode中有兩種方法可檢視IL2CPP字串的表示法。我們可以直接檢視字串儲存器,或者呼叫libil2cpp中某個字串的處理程式,將字串轉化成Xcode可以顯示的std::string。檢視名為 _stringLiteral1字串的值(劇透:內容為“Hello, IL2CPP!”)。

  在帶內嵌Ctags的生成程式碼(或在Xcode中使用Cmd+Ctrl+J)中,我們可以跳轉至_stringLiteral1的定義並發現其型別為Il2CppString_14:


[AppleScript] 純文字檢視 複製程式碼 ?
01 02 03 04 05 06 07 08 09 10 struct Il2CppString_14 { Il2CppDataSegmentString header; int32_t length; uint16_t chars[15]; };


  實際上,IL2CPP中所有字串都如此顯示。我們可以在object-internals.h標頭檔案中找到Il2CppString的定義。在IL2CPP中,這些字串包括任何託管型別的標頭部分,Il2CppObject(通過Il2CppDataSegmentString定義型別訪問)後是4位元組長度,然後是雙位元組字元陣列。編譯時定義的字串,如 _stringLiteral1,以定長chars陣列結束,但是執行時產生的字串具有分配的陣列。字串中的字元編碼為UTF-16。

  如果我們新增 _stringLiteral1到Xcode的監視視窗,我們可選擇View Memory of “_stringLiteral1”選項,以便檢視儲存器中字串的佈局。

 

  然後在儲存器檢視器中,我們可以看到以下內容:

 

  字串的頭成員為16位元組,因此將其跳過後,我們會發現四位元組的值為0x000E (14)。該範圍後的下一個位元組為字串0x0048 (‘H’) 的首位字元。因為每個字元為兩位元組寬度,但是該字串中所有字元僅匹配一個位元組寬度,所以在Xcode右側顯示這些字元且各字元中間以圓點隔開。字串內容仍清晰可見。該字串檢視方法確實有效,但難於檢視更加複雜的字串。

  在Xcode中我們也可通過lldb命令提示符檢視字串內容。在使用libil2cpp時,utils/StringUtils.h資料頭會提供介面處理一些字串程式。特別是通過lldb命令提示符呼叫Utf16ToUtf8的方法。其介面如下所示:

[AppleScript] 純文字檢視 複製程式碼 ?
static std::string Utf16ToUtf8 (const uint16_t* utf16String);


  我們可以把C++裡的字串內容轉變成這種方式,將返回一個UTF-8編碼的std::string。然後,如果在lldb命令提示符中使用p命令,則可以列印字串內容。


[AppleScript] 純文字檢視 複製程式碼 ?
1 2 (lldb) p il

相關推薦

unity3DIL2CPP 內部構建生成程式碼除錯技巧

轉自:http://www.manew.com/thread-40379-1-1.html 在本文中,我們將探究一些程式碼除錯技巧,一些可以使IL2CPP生成的C++程式碼除錯更加容易的技巧。我們將瞭解如何設定斷點、檢視字串和使用者定義型別的內容、以及如何確定出現異

問題收集使用mybatis generator生成程式碼報錯,StringIndexOutOfBoundsException異常

問題描述:在使用mybatis 生成程式碼時,報錯 報錯:java.lang.StringIndexOutOfBoundsException: String index out of range: -1  問題解決方案:請檢查 table 標籤下的 domainObj

(七)Unity5.0新特性------介紹IL2CPP內部構建

孫廣東  2015.5.20介紹IL2CPP內部構建將近一年以前的事了,Unity開始談論未來在Unity中的指令碼。新的 IL2CPP 指令碼後端答應(highly-portable)給Unity帶來了高效能、 高行動式虛擬機器。今年 1 月,Unity使用 IL2CP

C#實踐問題有哪些高效的VS除錯技巧

高效的VS除錯技巧 本文總結了十個除錯技巧,當你使用VS的時候可以節省你很多時間。 1.懸停滑鼠查看錶達式 除錯有時候很有挑戰性,當你步入一個函式想看看哪塊出錯的時候,檢視呼叫棧來想想值是從哪來的。另一些情況下,則需要新增一些監視表示式,或者檢視區域性變數列表,這通常還是花費一些時

Python 程式碼除錯技巧使用 PyDev 進行除錯

(?)[-] 使用 pdb 進行除錯 表 1 pdb 常用命令 清單 1 測試程式碼示例 清單 2 利用 pdb 除錯 清單 3 退出 debug 清單 4 debug 過程中列印變數 清單 5 停止 de

超詳細用圖詮釋Android Studio除錯技巧

在之前的 Android Studio實用快捷鍵,帶你高效編碼! 一文中,我根據自己在實際開發中的使用場景,列舉了能夠讓我們提升效率的快捷鍵,如果你還沒看,建議你看一下,畢竟我列舉的都是自己用的,很實在,同時也歡迎你能夠補充。同時,在那篇文章的 除錯 快捷鍵

Android Studio程式碼除錯技巧

ndroid Studio目前已經成為開發Android的主要工具,用熟了可謂相當順手。作為開發者,除錯並發現bug,進而解決,可是我們的看家本領。正所謂,工欲善其事必先利其器,和其他開發工具一樣,如Eclipse、Idea,Android Studio也為我們提供了強

Hacking: The Art of Exploitation 讀書筆記(一)程式碼除錯技巧

GDB 相關 -q 不列印版本資訊 功能: set disassemble-flavor intel /att 設定彙編語法list:列印程式碼disassemble:反彙編break:設定斷點r

一路踩坑,被迫聊聊 C# 程式碼除錯技巧和遠端除錯

## 一:背景 ### 1. 講故事 每次專案預交付的時候,總會遇到各種奇葩的坑,我覺得有必要梳理一下以及如何快速解決的,讓後來人避避坑,這篇就聊聊自己的所聞所遇: * 我去,本地環境程式碼跑的哧溜,上了測試環境出問題 * 我去, 第三方提供的 dll 跑出 bug 了 ## 二:兩個大坑的解

Microsoft Visual Studio除錯技巧(二)Visual Stdio 2010清理除錯生成的快取檔案

使用Visual Stdio 2010程式設計時,會發現硬碟的空閒空間快速不斷減少,這是因為VS2010在除錯時,會生成快取檔案,字尾名iTrace,很佔空間,需要定期手動清理。 IDE中,在“工具→選項→IntelliTrace→高階→IntelliTrace記錄的位置”可以配置儲存i

【視訊】超級賬本HyperLedgerFabric原始碼走讀(一)專案構建程式碼結構

作者: 李佶澳   轉載請保留:原文地址   釋出時間:2018/11/18 14:26:00   說明 編譯方法 make peer make release 和 make r

SparkSQL檢視除錯生成程式碼

網站和一些書籍都有介紹SparkSQL(DataFrame)會根據相應的操作生成最終執行的語句。這裡從一個簡單的、低階的問題入手到最後通過檢視生成的程式碼查詢問題的根源,並簡單介紹怎麼來除錯SparkSQL。 問題來源: 1 2 3 4 5 6 7 8 9

堪比 Java 程式碼除錯的方案用 WebStorm + JetBrains IDE Support 外掛,在 WebStorm 內除錯程式碼

準備工作 WebStorm 的 Javascript Debug 只能選擇 chrome(至少在我的電腦上是這樣),所以,JetBrains IDE Support 外掛需要安裝到 chrome 上。 chrome 最新版下載 安裝外掛,在應用中心,搜尋:JetBrai

detectron程式碼理解(一)Resnet模型構建理解

這裡具體以resnet50為例進行說明,一句一句地分析程式碼,程式碼位置位於Resnet.py,具體的分析函式為add_ResNet_convX_body. 在分析之前首先貼上resnet50的程式碼結構圖: # add the stem (by default, conv1 and

detectron程式碼理解(二)FPN模型構建

1.FPN的原理 FPN的原理示意圖如下,上述包括一個自底向上的線路,一個自頂向下的線路,橫向連線(lateral connection),圖中放大的區域就是橫向連線。 自底向上的路徑:自下而上的路徑是卷積網路的前饋計算,在前向過程中,feature map的大小在經過某些層後會改變,

SpringBoot(五)多模組專案Generator生成程式碼

本作品採用知識共享署名 4.0 國際許可協議進行許可。 本文作者:低調小熊貓 文章連結:https://aodeng.cc/archives/springbootwu 轉載宣告:自由轉載-非商用-非衍生-保持署名,非商業轉載請註明作者及出處,商業轉載請聯絡作者本人qq:2

javaweb專案使用者(登入和登出)實現 SSM框架(mybatis-generator自動生成程式碼

SSM框架的搭建環境(Spring,SpringMVC,Mybatis) 使用工具:maven、idea、tomcat用的是8、jdk版本1.8 一、整個專案的結構: 使用者模組流程 pom.xml -> web.xml -> db->model

tensorflow+faster rcnn程式碼理解(三)損失函式構建

前面兩篇部落格已經敘述了基於vgg模型構建faster rcnn的過程: tensorflow+faster rcnn程式碼理解(一):構建vgg前端和RPN網路 tensorflow+faster rcnn程式碼解析(二):anchor_target_layer、proposal_targ

Spring boot入門(三)SpringBoot整合結合AdminLTE(Freemarker),利用generate自動生成程式碼,利用DataTable和PageHelper進行分頁顯示

  關於SpringBoot和PageHelper,前篇部落格已經介紹過Spring boot入門(二):Spring boot整合MySql,Mybatis和PageHelper外掛,前篇部落格大致講述了SpringBoot如何整合Mybatis和Pagehelper,但是沒有做出實際的範例,本篇部落格是連

【MPC5744P】S32DS中Processor Expert自動生成程式碼工具使用教程(二) FreeMaster除錯

對於使用除錯口,下位機不需要做任何特別的設定,直接按照連結中設定方法來設定上位機即可,注意FreeMaster只能監測下位機中的全域性變數。連結地址:https://blog.csdn.net/u010875635/article/details/84789579   若是使用