c++ 调用lua 错误 显示堆栈信息

    本篇实现c++调用lua出错时win32如何显示堆栈信息

     test.lua 文件

function __G__TRACKBACK__(msg)
    print("----------------------------------------")
    print("LUA ERROR: " .. tostring(msg) .. "\n")
   print(debug.traceback())
    print("----------------------------------------")
end

function Test(historyWin, historyCharge, Css) 
 
	print("Test")
	aS = 0/0
	tab = {}
	tab.helloword("")
	As=1
	Bs=2
	Cs=historyWin * historyCharge * Css 
	return As, Bs, Cs
end 


    方法一:脚本内部实现信息
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
int main(int argc, const char * argv[]) {
 int a=0,b=0,c=0;
 string *fs = getFileContext("test.lua");  //获取脚本内容
 lua_State * m_L; 
 m_L = luaL_newstate();
 luaL_openlibs(m_L);     //需要--否则不会显示打印信息、还会出现各种未知错误信息
 ::lua_pushcfunction(m_L, PrintLuaStack); 
 if(!luaL_dostring(m_L,(*fs).c_str())) 
 { 
  int rst = lua_getglobal(m_L, "__G__TRACKBACK__");//通过函数名,压入错误处理函数   
  int erroFunc = 0;
  if (lua_type(m_L, -1) == LUA_TFUNCTION) 
   erroFunc =   lua_gettop(m_L);  //获取 __G__TRACKBACK__ 栈位置  --当前栈位置
  rst = lua_getglobal(m_L, "getA");
  if (lua_type(m_L, -1)  == LUA_TFUNCTION) 
  {
   lua_pushnumber(m_L, 1);   
   int erro = lua_pcall(m_L, 1, 1, erroFunc);
   if(!erro) {     
    if(lua_isnumber(m_L, -1))
      a = (int)luaL_checkinteger(m_L, -1);
     b = (int)luaL_checkinteger(m_L, -2);
     c = (int)luaL_checkinteger(m_L, -3);
    lua_pop(m_L, 3);
   } 
  }
 } 
 if(m_L)
   lua_close(m_L);
 getchar();
 return 1;
}
 

        方法二:c++源代码实现

int PrintLuaStack(lua_State *L)
{
	lua_State* pLuaState = L;

	int stackTop=lua_gettop(pLuaState);//获取栈顶的索引值
	int nIdx = 0;
	int nType;
	std::string strErro = "";

	//错误信息
	for(nIdx = stackTop;nIdx > 0;--nIdx)
	{
		nType = lua_type(pLuaState, nIdx); 
		strErro += lua_typename(pLuaState,nType);
		strErro += lua_tostring(pLuaState,nIdx);
		strErro += "\n";
	}
	//debug.traceback
	lua_getglobal(pLuaState, "debug");  
	lua_getfield(pLuaState, -1, "traceback");  
	int iError = lua_pcall( pLuaState,    //VMachine    
				0,    //Argument Count    
				1,    //Return Value Count    
				0 );   
	const char* sz = lua_tostring(pLuaState, -1);  
	strErro += sz;
	printf(strErro.c_str());
	return 0;
}

int main(int argc, const char * argv[]) {
	int a=0,b=0,c=0;
	string *fs = getFileContext("test.lua");
	lua_State * m_L; 
	m_L = luaL_newstate();
	luaL_openlibs(m_L);     //需要--否则不会打印信息
	::lua_pushcfunction(m_L, PrintLuaStack);
	int erroFunc = lua_gettop(m_L);
	if(!luaL_dostring(m_L,(*fs).c_str())) 
	{  
	int rst =  lua_getglobal(m_L, "Test");
	if (rst != LUA_TFUNCTION)
	  return 1;
	lua_pushnumber(m_L, 1);  
	lua_pushnumber(m_L, 13);
	lua_pushnumber(m_L, 13);
	int erro = lua_pcall(m_L, 3, 3, erroFunc);
		if(!erro) {					
			if(lua_isnumber(m_L, -1))
	 		 a = (int)luaL_checkinteger(m_L, -1);
			 b = (int)luaL_checkinteger(m_L, -2);
			 c = (int)luaL_checkinteger(m_L, -3);
			lua_pop(m_L, 3);
		}
	}
	if(m_L)
	  lua_close(m_L);
	getchar();
	return 1;
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值