http://www.unknownworlds.com/decoda
今天項目組的同事提起來要整個調式lua的工具,由於近期項目中用到lua的腳本日趨增長,導致腳本出問題的幾率也日益增加~~ 。調試起來也不是特別方便,所以有必要整一個。於是就先找到了一個調式器,暫時可以滿足項目的需求。下面先轉帖一下網上一位朋友寫的軟件使用幫助,感謝!
Decoda Tutorial 1:從Decoda啟動宿主程序調試lua
我從Decoda剛發布就一直關注着,這個工具可以注入到宿主程序內對lua腳本進行調試,還可以設置斷點觀察變量的值,功能非常強大。
下面我介紹一下使用方法。
首先找到一個使用了lua的程序,我這里用wireshark舉例,這是個很好很強大的網絡截包工具,wireshark內部使用了lua。沒有wireshark的請下去google一下並下載安裝,此為開源軟件。
調試使用lua的宿主程序有兩種啟動方式,一種是從Decoda啟動宿主程序,另一種是先啟動宿主程序然后用decoda注入。
本篇文章將介紹如何從Decoda啟動宿主程序
啟動Decoda並點擊Debug目錄下的StartDebuging,彈出一個工程設置對話框,點擊對話框里的第一行的Command右邊的按鈕,然后找到你的wireshark.exe可執行文件,點擊OK。
此時wireshark程序開始執行,稍等一會在左邊的窗口中會出現一個init.lua文件,這就是這個wireshark使用的lua文件。(decoda可以檢測程序使用的所有lua文件並將他們顯示在左邊的窗口中)
現在你可以在這個init.lua里面設置斷點了,在disable_lua = true; do return end;這一句下斷點,聰明人都看得出來,只能在這里下斷點,因為下面的語句都是不會執行的,除非將這一句注釋。選擇Debug菜單中的Stop Debugging退出調試,然后再選擇Start Debugging重新啟動調試,此時程序就會斷點到你設置斷點的這一行。
整個流程就是這樣,你可以在Watch里面輸入要監視的變量,這些操作都和visual studio中一樣。
Decoda Tutorial 1:從Decoda啟動宿主程序調試lua
我從Decoda剛發布就一直關注着,這個工具可以注入到宿主程序內對lua腳本進行調試,還可以設置斷點觀察變量的值,功能非常強大。
下面我介紹一下使用方法。
首先找到一個使用了lua的程序,我這里用wireshark舉例,這是個很好很強大的網絡截包工具,wireshark內部使用了lua。沒有wireshark的請下去google一下並下載安裝,此為開源軟件。
調試使用lua的宿主程序有兩種啟動方式,一種是從Decoda啟動宿主程序,另一種是先啟動宿主程序然后用decoda注入。
本篇文章將介紹如何從Decoda啟動宿主程序
啟動Decoda並點擊Debug目錄下的StartDebuging,彈出一個工程設置對話框,點擊對話框里的第一行的Command右邊的按鈕,然后找到你的wireshark.exe可執行文件,點擊OK。
此時wireshark程序開始執行,稍等一會在左邊的窗口中會出現一個init.lua文件,這就是這個wireshark使用的lua文件。(decoda可以檢測程序使用的所有lua文件並將他們顯示在左邊的窗口中)
現在你可以在這個init.lua里面設置斷點了,在disable_lua = true; do return end;這一句下斷點,聰明人都看得出來,只能在這里下斷點,因為下面的語句都是不會執行的,除非將這一句注釋。選擇Debug菜單中的Stop Debugging退出調試,然后再選擇Start Debugging重新啟動調試,此時程序就會斷點到你設置斷點的這一行。
整個流程就是這樣,你可以在Watch里面輸入要監視的變量,這些操作都和visual studio中一樣。
Decoda Tutorial 2:Decoda注入宿主程序的調試方法
上一篇文章介紹了從Decoda中啟動宿主程序來調試Lua的方法,這種方法唯一的缺點是你無法在visual studio中調試宿主程序。我們經常可能會碰到宿主程序和腳本我們都想調試的情況,用上一個Tutorial的方法是肯定不行的了。這次將介紹對已經啟動的宿主程序用Decoda注入的調試方法,這樣我們就可以在Visual Studio中調試宿主程序后用Decoda再注入宿主程序來調試Lua腳本。(宿主程序在被調試的情況下是不能注入的,必須在宿主程序執行的情況下注入,否則Visual Studio和Decoda都會死掉)
上次我們用的wireshark軟件做的演示,這個軟件在啟動的時候通過調用一個init.lua進行一些初始化操作。現在我們需要一個運行后並不立即執行Lua腳本,而是手動操作后再執行lua腳本的程序,這樣子我就可以先讓程序啟動,然后注入decoda的調試dll文件到宿主程序中來調試lua腳本。
找一個現成的程序的話實在太麻煩了,我就自己寫了一個超簡單的程序,代碼如下,宿主程序:main.cpp,腳本:add.lua,
file:main.cpp
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include <stdio.h>
#include <conio.h>
using namespace std;
int main()
{
lua_State *L = lua_open(); //初始化lua
luaL_openlibs(L); //載入所有lua標准庫
printf( "Press any key to run lua file./n");
getch();
luaL_dofile(L, "add.lua"); //執行add.lua,將add函數加入lua_State棧中
lua_getglobal(L, "add"); //通過函數名取出函數地址壓入棧
lua_pushnumber(L, 10); //將第一個參數壓入棧
lua_pushnumber(L, 10); //將第二個參數壓入棧
lua_call(L, 2, 1); //調用add函數
int sum = (int)lua_tonumber(L, -1); //從lua_State棧中取出函數執行結果
lua_pop(L, 1); //將結果彈出棧
printf( "The sum is %d/n", sum );
getch();
return 1;
}
file : add.lua
function add ( x, y )
return x + y
end
如果您不是程序員不會編譯那也沒關系 ,我已經把編譯好的可執行文件和lua腳本上傳到skydrive了,需要的可以去下載,鏈接在此:DecodaTutorial2_demo
好,准備工作完成,執行解壓出來的test.exe文件,程序停在此處,此時千萬不要傻傻的去press any key哦!因為這時我們還沒將Decoda注入到此程序中呢,我們要做的是等待Decoda注入后執行add.lua腳本來進行調試。
那么現在運行Decoda吧,選擇Debug->Processes選項
彈出了一個對話框,這個對話框列出了當前系統的所有進程,選中我們的test.exe進程,然后對着Attach按鈕狠狠的按下去吧
好了,如果RP(人品)正常的話你應該看到左下角的Output出現如下信息,表示我們注入成功了。
現在我們知道我們要執行的add.lua腳本,所以我們可以在Decoda中直接找到並打開此腳本文件,如果我們不知道的話可以先讓程序執行一遍,程序執行結束后在Decoda左側的窗口中會列出程序執行過的所有lua文件。我在三行代碼都下了斷點,原因是宿主程序在luaL_dofile的時候會斷一次,調用add函數的時候會直接斷到函數的起始代碼處,我們可以從黃色箭頭出現在代碼行中的順序觀察到。
好了現在我們可以Press any key讓我們的test.exe去執行add.lua腳本了!
當你press any key后,你會發現Decoda斷點到了end這行,我們單步執行,他又到了function add(x,y)這行,再單步執行來到end這行。下一個單步執行就會到了return x+y這行,這時就是宿主程序調用add函數的時候
lua_call(L, 2, 1); //調用add函數
這時我們可以查看lua腳本中x變量和y變量的值,找到Watch窗口,雙擊Name列的空白處,輸入變量名x然后回車,OK,你看到了你x變量的值和類型。
按F5結束調試,讓test.exe恢復執行。好了,整個流程結束。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/cyblueboy83/archive/2010/01/01/5116140.aspx
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow