lua语言特殊性,导致lua程序出错时仍然不退出程序,在测试阶段对于一些偶发性的bug,很难搞定(可能是由于一个函数只执行了一半就出异常停止,导致程序逻辑异常),所以现在有一个需求就是能够捕获lua的trakback信息,然后输出到一个文件里面,这样如果是由于某个函数执行错误导出程序出现逻辑异常,就会很容易定位。xpcall 这个方法不能满足需求,要在C++层搞吗?望高手指点一二!
xpcall 为什么这个方法不能满足需求 你使用xpcall 不是可以输出异常信息吗 然后你把debug.traceback()的信息写入文件不是就行了
main.lua中__G__TRACKBACK__里插入
可以将错误日志写入文件
也可以上报到服务器
…/
print(package.path)
function G__TRACKBACK(errorMessage)
– print("G__TRACKBACK__111")
– local path = CCFileUtils:sharedFileUtils():getWritablePath()…“log.txt”
– print(path)
– io.writefile(path, “\r\n”…errorMessage, “a+b”)
if “ASSERT FAILED ON LUA EXECUTE: CCHTTPRequest::getResponseString() - request not completed” ~= tostring(errorMessage) and
“ASSERT FAILED ON LUA EXECUTE: Request not completed” ~= tostring(errorMessage) then
print("----------------------------------------")
print(“LUA ERROR: " … tostring(errorMessage) … “\n”)
print(debug.traceback(”", 2))
print("----------------------------------------")
end
end
collectgarbage(“setpause”, 100)
collectgarbage(“setstepmul”, 5000)
require(“app.MyApp”).new():run() 这样子在lua层报错的时候,没有调用到__G__TRACKBACK
xpcall要求传入执行的函数和错误处理函数,工程这把每个函数都搞一次?
— Begin quote from ____
引用第3楼gj_feixiang于2015-05-18 19:44发表的 回 2楼(ase7en) 的帖子 :
…/
print(package.path)
function G__TRACKBACK(errorMessage)
– print("__G__TRACKBACK__111")
– local path = CCFileUtils:sharedFileUtils():getWritablePath()…“log.txt”
… http://www.cocoachina.com/bbs/job.php?action=topost&tid=301120&pid=1309730
— End quote
好吧,看来你需要源码。。
xpcall里传一个全局函数 在函数里处理你的逻辑
— Begin quote from ____
引用第4楼gj_feixiang于2015-05-18 19:46发表的 回 1楼(风愁) 的帖子 :
xpcall要求传入执行的函数和错误处理函数,工程这把每个函数都搞一次? http://www.cocoachina.com/bbs/job.php?action=topost&tid=301120&pid=1309732
— End quote
把你游戏的所有启动语句 封到一个方法里
我的问题是lua层出现异常的时候,没调用到__G__TRACKBACK__这里!
搞定了谢谢!main.lua如下写就可以了
package.path = package.path … “;.app/protobuf/?.lua;./scripts/app/protobuf/?.lua;”
package.cpath = package.cpath … ‘;…/protobuf/?.so’
print(package.path)
function G__TRACKBACK(errorMessage)
print("__G__TRACKBACK__111")
local path = CCFileUtils:sharedFileUtils():getWritablePath()…“log.txt”
print(path)
io.writefile(path, “\r\n”…errorMessage, “a+b”)
if “ASSERT FAILED ON LUA EXECUTE: CCHTTPRequest::getResponseString() - request not completed” ~= tostring(errorMessage) and
“ASSERT FAILED ON LUA EXECUTE: Request not completed” ~= tostring(errorMessage) then
print("----------------------------------------")
print(“LUA ERROR: " … tostring(errorMessage) … “\n”)
print(debug.traceback(”", 2))
print("----------------------------------------")
end
end
local function startGame( … )
collectgarbage(“setpause”, 100)
collectgarbage(“setstepmul”, 5000)
require(“app.MyApp”).new():run()
end
xpcall(startGame,G__TRACKBACK)
startGame()
mark 


