2009-04-23 44 views
27

如何調試嵌入在C++應用程序中的lua代碼?調試嵌入式Lua

從我收集的內容中,我需要購買一個特殊的IDE並鏈接到他們特殊的lua運行時(ugh)。或者我需要使用lua debug API調用在遊戲引擎中構建調試控制檯。

我傾向於編寫我自己的調試控制檯,但它看起來像很多工作。我可以花更多時間來拋光遊戲的其他部分。

回答

10

有幾種工具可以實現至少部分的功能。我已經看到了VS插件的參考,在Lua for Windows中有一個SciTE調試器擴展,並且有Kepler項目的RemDebug以及它們的LuaEclipse

RemDebug可能正處於您需要的軌道上,因爲它可以用於調試用Lua編寫的CGI腳本。它需要訪問LuaSocket模塊來提供目標腳本和控制器以及其他一些模塊之間的通信通道。

更大的問題可能是從遊戲引擎在腳本中放置的任何沙箱中加載任意模塊的能力。如果你對引擎有一定的控制權,那麼這不會是一個大問題。

例如,這對於Adobe Lightroom插件的開發者來說目前不可行,因爲Lightroom不會在插件的沙盒中公開require

讓我感到驚訝的是,在使用Lua時很少有人覺得需要調試器。我已經爲各種項目構建了幾個小應用程序,並且驚訝於完整的堆棧回溯和偶爾的print調用的組合以及如何定位require "strict"並未預防的錯誤。

+0

RemDebugger幾乎就是我正在尋找的東西。它應該是可用的,並給我一個很好的基礎來定製。 – 2009-04-25 14:54:08

0

如果你使用的是windows和VS--你能用我們使用的技巧嗎?

將lua代碼複製到文件中。然後在lua代碼中調用調試器api(在C++中,這是DebuggerBreak()我認爲 - 請參閱here)。那麼當lua代碼執行調試器時就會啓動,你應該能夠指定文件。然後正常調試?

+1

解決了一半的問題。我真正想做的是逐行執行lua代碼。如果在理解你的解決方案的時候,我可以在lua腳本的任何一行中打破,但是我會在C++調試器中。我將如何檢查本地lua變量等。 – 2009-04-23 06:47:24

+0

我分兩部分認爲這是一個問題 - 一個是便於檢查這將是很難,因爲你會寫調試器擴展來做到這一點。第二種方法將決定lua'引擎'如何存儲這些值並手動或通過宏觀來檢查它們。 – 2009-04-23 06:55:11

2

我不明白調用DebuggerBreak應該如何工作,因爲這是.NET特定的。我會假設只適用於指向CLR的分叉Lua。

如果你使用標準的Lua,你可以通過lua函數調用debug.debug()來獲得一些粗糙的調試工具。這會將Lua扔進你的控制檯,所以如果你從控制檯運行lua,你應該可以交互地發出lua命令來檢查你的當前狀態。 debug.debug()不會讓你進入當前的堆棧框架,所以你必須使用debug.getlocal()來讀取你的變量的值。

我還沒有嘗試過,但我其實並不認爲讓你自己的可行的調試控制檯是那麼多的工作。記住Lua並不像C++那樣複雜,所以這樣做要比製作真正的C++調試器(比如說gdb)容易得多。

我認爲有很多人已經做過類似的事情,你可以看看哪些代碼。 Here是僅在lua中編寫的CLI調試器。只有一個lua文件。不應該爲了您的需要而努力使用和修改。

6

Decoda怎麼樣?有一段視頻解釋瞭如何使用它,它對嵌入的lua源碼非常適合。 (我是一個快樂的客戶)。而且很便宜。

2

您可以使用我的調試器:GRLD(圖形遠程lua調試器)。和RemDebug一樣,它使用套接字連接,但與RemDebug不同,它有一個很好的圖形界面。源代碼提供,所以你可以使它在任何平臺上工作。它適用於標準的lua運行時。免費用於非商業用途。

編輯:對不起,我不得不關閉網站,所以軟件不能再下載。如果我找到時間,我可能會在稍後將它作爲開源軟件發佈。

編輯2:鏈接更新,現在在美國舉行的github在MIT許可(開源)

2

你不需要編寫自己的控制檯,你可能要開始與現有的一個。 RemDebug已經被提出;我一直在開發MobDebug,它是一個基於RemDebug的調試器,但有大量新功能和錯誤修復。詳細的更改列表在README

在腳本中啓用調試可能是因爲添加require('mobdebug').start()(如果您運行的應用程序,並在同一臺機器上調試服務器)一樣簡單。這應該嘗試連接到偵聽localhost上默認端口的調試器。您可以使用MobDebug中包含的命令行界面,也可以使用ZeroBrane Studio,這是一個與MobDebug集成的Lua IDE,用於提供調試功能。 IDE支持Love2d,Moai和其他Lua引擎的調試,也可能適用於您的設置。