2013-09-08 50 views
6

Làm cách nào để gỡ lỗi mã Lua 5.2.2 được nhúng bên trong ứng dụng C++ của tôi?Gỡ lỗi nhúng mã Lua 5.2.2

Tôi đã xem xét điều này question và tất cả các IDE được cung cấp trong đó đối phó với 5.1 trở xuống và khi tôi cố gắng sử dụng chúng với 5.2.2 chúng bị lỗi.

Trả lời

5

Bạn sẽ có thể gỡ lỗi ứng dụng của mình bằng cách sử dụng ZeroBrane Studio bằng cách theo dõi instructions for Lua 5.2 debugging. Lưu ý rằng bạn sẽ cần phải có luasocket biên dịch với Lua5.2. (Sự cố mà bạn thấy có thể là do ứng dụng của bạn tải luasocket được biên dịch dựa trên Lua5.1, mà lần lượt tải Lua5.1 DLL hoặc không tìm thấy các ký hiệu bắt buộc.)

Nếu bạn không muốn biên dịch luasocket, bạn có thể lấy mã nhị phân cho Windows/OSX/Linux từ this folder and its subfolders; chỉ cần đảm bảo rằng các thư viện này nằm trong LUA_CPATH trước bất kỳ thư mục nào có thể có luasocket được biên dịch dựa trên Lua5.1.

[Cập nhật dựa trên thảo luận trò chuyện] Lý do bạn có thể gặp phải nhiều sự cố VM là ứng dụng của bạn có thể biên dịch tĩnh Lua thông dịch viên. Sau đó bạn tải luasocket (trực tiếp hoặc thông qua mobdebug), được biên dịch với lua52.dll, tải một bản sao của trình thông dịch. Để tránh điều này, bạn có hai lựa chọn: (1) biên dịch luasocket vào ứng dụng của bạn giống như cách bạn bao gồm thông dịch viên lua; bạn sẽ không cần bất cứ điều gì khác ngoại trừ một tập tin mobdebug.lua để gỡ lỗi ứng dụng của bạn, hoặc (2) sử dụng dll proxy; nó sẽ trông giống như lua52.dll, nhưng sẽ thực sự proxy các cuộc gọi của bạn vào thư viện lua được biên dịch tĩnh của bạn, tránh các vấn đề với nhiều máy ảo. proxy dll là dành cho Lua 5.1, nhưng bạn có thể tinh chỉnh kịch bản để làm cho nó hoạt động cho Lua 5.2.

(Nếu thông dịch viên của bạn không được biên dịch tĩnh, bạn vẫn có thể nhận được hai thông dịch viên nếu Lua DLL bạn tải được đặt tên khác nhau từ lua52.dll.)

+0

Điều đó không hiệu quả đối với tôi. Chương trình của tôi bị treo ngay khi tôi gọi lua_call. Đây là những gì tôi đã làm, tôi đã đặt mã này vào tệp .lua của tôi 'package.path = package.path .." C: /ZeroBraneStudio/lualibs/mobdebug/mobdebug.lua " package.cpath = package.cpath .. "C:/ZeroBraneStudio/bin/clibs52/socket/?. dll" yêu cầu ('mobdebug'). Start() 'và lỗi tôi nhận được là' PANIC: lỗi không được bảo vệ trong cuộc gọi đến Lua API (main.lua: 3 : cố gắng lập chỉ mục toàn cầu 'gói' (giá trị nil)) ' – Caesar

+0

' cố gắng lập chỉ mục gói 'toàn cầu' (giá trị nil) ': vậy, điều gì đã xảy ra với gói' global' trong môi trường của bạn? –

+0

Ngoài ra, bạn có thể muốn thêm '... clibs52/mime/?. dll' vì nó có thể được tải từ' socket.lua' và bạn muốn chắc chắn rằng nó được tải từ 'clibs52'. Có thể thuận tiện hơn khi chuyển cuộc thảo luận khắc phục sự cố sang [Ma trận ZeroBrane Studio] (http://studio.zerobrane.com/community.html). –

3

Để đối phó với OP của nhận xét yêu cầu, dưới đây là cách bạn nên mở các lua tiêu chuẩn thư viện "cơ sở" từ C++:

#include "lua.hpp" 

//... 
int main() 
{ 
    lua_State* L = luaL_newstate(); 
    luaL_requiref(L, "base", luaopen_base, 0); 

    // ... 
    int error = luaL_loadfile(L, mainLua); 
    lua_call(L, 0, 0); 

    lua_close(L); 
} 

Lưu ý rằng bạn có thể mở tất cả các thư viện chuẩn cùng một lúc bằng cách thay thế:

luaL_requiref(L, "base", luaopen_base, 0); 

với

luaL_openlibs(L); 

Lua 5.2 reference manual Section 6 có thêm thông tin về điều này.

+0

Cảm ơn, điều đó dường như đã thực hiện thủ thuật cho lỗi đó nhưng dường như tôi có một lỗi khác. 'PANIC: lỗi không được bảo vệ khi gọi tới Lua API (mô-đun tải lỗi 'socket.core' từ tệp 'C:/ZeroBraneStudio/bin/clibs52/socket \ core.dll': Không tìm thấy mô-đun được chỉ định. ) Tôi đã nhìn vào vị trí đó và tôi có thể nói với bạn rằng nó có ở đó thông qua việc sao chép và dán. – Caesar

+0

Bạn đang cố gắng gỡ lỗi một ứng dụng C/C++ thực tế đang nhúng lua? – greatwolf

+0

Tôi đã làm một căn phòng để chúng ta có thể thảo luận về điều này, sẽ sạch hơn nhiều ở đây. vui lòng tham gia với tôi http://chat.stackoverflow.com/rooms/37030/debugging-embedded-lua-5-2-2-code – Caesar