如何在vsvisualstudio调试环境下查看lua的调用栈,变量信息

如何在vsvisualstudio调试环境下查看lua的调用栈,变量信息,第1张

编辑C:/Program Files/Microsoft Visual Studio 8/Common7/Packages/Debugger/autoexpdat文件,

在文件最后[hresult]之上的空白插入以下代码,就可以在 visualstudio调试的时候看到lua的调用栈、变量信息

lua_State {

preview (

#(

"thread top=", [$ctop-$cbase, i]

)

)

children (

#(

[raw members]: [$c,!],

globals: [$cl_gt],

registry: [$cl_G->l_registry],

stack size: [$ctop-$cbase, i],

stack:#array (

expr: $cbase[$i],

size: $ctop - $cbase,

base: 1

),

callStack Size: $eci-$ebase_ci,

callStack:

#array (

expr: $eci[-$i],

size: $eci-$ebase_ci,

)

)

)

}

Node {

preview (

#( $ci_keytvk, " = ", $ci_val )

)

children (

#(

key: $ci_keytvk,

val: $ci_val,

#if( $ci_keynknext != 0 ) (

#( next: $ci_keynknext )

)

)

)

}

lua_TValue {

children (

#switch($ctt)

#case 2 ( ; LUA_TLIGHTUSERDATA

ptr: #((const char)($cvaluep))

)

#case 5 ( ; LUA_TTABLE

#(

[raw]: [$c,!],

array size: $cvaluegc->hsizearray,

#array (

expr: $evaluegc->hmetatable,

size: $evaluegc->hmetatable != 0,

): #( metatable: $e ),

#array (

expr: $cvaluegc->harray[$i],

size: $cvaluegc->hsizearray,

base: 1

),

#array (

expr: #( $cvaluegc->hnode[$i], 2 ),

size: (1<<$cvaluegc->hlsizenode),

base: 1

): #( hash part: $e )

)

)

#case 6 ( ; LUA_TFUNCTION

#if ($cvaluegc->clcisC) (

#(

env: $cvaluegc->clcenv,

#array (

expr: $evaluegc->clcupvalue[$i],

size: $evaluegc->clcnupvalues,

): #( upvalues: $e )

)

) #else (

#($cvaluegc->cll)

)

)

#case 7 ( ; LUA_TUSERDATA

#(

#array (

expr: $evaluegc->uuvmetatable,

size: $evaluegc->uuvmetatable != 0,

): #( metatable: $e ),

env: $cvaluegc->uuvenv,

ptr: #((const char)((&$cvaluegc->u)+1)),

size: $cvaluegc->uuvlen

)

)

#case 8 ( #($cvaluegc->th) ) ; LUA_TTHREAD

)

preview (

#switch($ctt)

#case 0 ( "nil" ) ; LUA_TNIL

#case 1 (

#if ($cvalueb == 0) (

"false"

) #else (

"true"

)

)

#case 2 ( ; LUA_TLIGHTUSERDATA

#($cvaluep, " lightuserdata") )

#case 3 ( ; LUA_TNUMBER

#("#", $cvaluen) )

#case 4 ( ; LUA_TRING

#( $cvaluegc->ts) )

#case 5 ( ; LUA_TTABLE

#( "table" )

)

; #case 6 ( #($cvaluegc->cl) ) ; LUA_TFUNCTION

#case 6 ( ; LUA_TFUNCTION

#if ($cvaluegc->clcisC) (

#($cvaluegc->cl)

) #else (

#( [((const char ) (&($evaluegc->cllp->source->tsv)+1)),sb],"(" ,($evaluegc->cllp->lineinfo),")" )

)

)

#case 7 ( #($cvaluegc->u) ) ; LUA_TUSERDATA

#case 8 ( #($cvaluegc->th) ) ; LUA_TTHREAD

#default ( "empty" )

)

)

}

Udata {

preview (

#( "userdata size=", $cuvlen, " ptr=", #((void)((&$c)+1)) )

)

}

CClosure {

preview (

$cf

)

}

LClosure {

preview (

#([(const char ) (&($ep->source->tsv)+1),sb] ,"(",($ep->lineinfo),")" )

)

}

Closure {

preview (

#if ($ecisC) ( #($ec) )

#else ( #($evaluegc->cll) )

)

}

Table {

children (

#(

[raw]: [$c,!],

[array size]: $csizearray,

#array (

expr: $emetatable,

size: $emetatable != 0,

): #( metatable: $e ),

#array (

expr: $carray[$i],

size: $csizearray,

base: 1

),

#array (

expr: #( $cnode[$i], 2 ),

size: (1<<$clsizenode),

base: 1

): #( key: $e )

)

)

preview (

#( "table" )

)

}

TString {

preview (

#("'", [(const char ) (&($etsv)+1),sb] )

)

}

CallInfo {

preview (

#( $efunc, ",",$efunc->valuegc->cllp->lineinfo[$esavedpc -$efunc->valuegc->cllp->code-1] )

)

}

local file = assert( ioopen( "F:/filenametxt" , "r" ) );

local result = {};

for line in file:lines() do

result[#result+1] = line;

end

file:close() --看情况关闭与否

至于你说的赋给变量 就从result里面取出来就ok了,key就是行号。

能。lua可以设置和读取Lua的变量,可以注册C函数让Lua代码调用,lua语言盘符名字能读取,Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

首先调用变量这个说法本身就是很奇怪,如果说LUA的函数可以说是变量的话,那么你的意思就是调用CCC这个函数的,但是函数不可能保存角色坐标,所以你这个事实上只是一个变量。很可能是个table,那么应该叫访问这个变量而不是调用。

C里面访问LUA的数值变量和访问table的方法是不一样的,访问table还要知道table的结构才能访问

以下为我的模拟代码,仅供参考

lua_State L = luaL_newstate();

luaL_openlibs(L);

luaL_dostring(L,

"CCC = {}"

"CCCposition = {10,20}"

);

lua_getglobal(L, "CCC");//将CCC压入栈顶

lua_getfield(L, -1, "position");//对栈顶进行 *** 作,将position压入栈顶

lua_pushnumber(L, 1);//索引1

lua_gettable(L, -2);

int x = luaL_checkinteger(L,-1);

lua_pushnumber(L, 2);//索引2

lua_gettable(L, -3);

int y = luaL_checkinteger(L,-1);

lua_pop(L, -1);

printf("x:%d y:%d\n",x,y);

lua_close(L);

变量就是存值的一个空间,变量需要声明。

变量是储存值的地方。 程序中有三种变量: 全局变量局部变量和表的域。

单个名字可以指代一个全局变量也可以指代一个局部变量 (或者是一个函数的形参,这是一种特殊形式的局部变量)。

名字指 程序中定义的标识符。

所有没有显式声明为局部变量 的变量名都被当做全局变量。 局部变量有其 作用范围 : 局部变量可以被定义在它作用范围中的函数自由使用。

在变量的首次赋值之前,变量的值均为 nil。

方括号被用来对表作索引:

对全局变量以及表的域之访问的含义可以通过元表来改变。 以索引方式访问一个变量 t[i] 等价于 调用 gettable_event(t,i)。 ,有一份完整的关于 gettable_event 函数的说明。 这个函数并没有在 lua 中定义出来,也不能在 lua 中调用。这里我们把提到它只是方便说明问题。)

varName 这种语法只是一个语法糖,用来表示 var["Name"]:

对全局变量 x 的 *** 作等价于 *** 作 _ENVx。 由于代码块编译的方式, _ENV 永远也不可能是一个全局名字

个名字可以指代一个全局变量也可以指代一个局部变量 (或者是一个函数的形参,这是一种特殊形式的局部变量)。

名字指 程序中定义的标识符。

所有没有显式声明为局部变量 的变量名都被当做全局变量。 局部变量有其 作用范围 : 局部变量可以被定义在它作用范围中的函数自由使用。

变量就是存值的一个空间,变量需要声明。

变量是储存值的地方。 程序中有三种变量: 全局变量、局部变量和表的域。

单个名字可以指代一个全局变量也可以指代一个局部变量 (或者是一个函数的形参,这是一种特殊形式的局部变量)。

名字指 程序中定义的标识符。

所有没有显式声明为局部变量 的变量名都被当做全局变量。 局部变量有其 作用范围 : 局部变量可以被定义在它作用范围中的函数自由使用。

在变量的首次赋值之前,变量的值均为 nil。

方括号被用来对表作索引:

对全局变量以及表的域之访问的含义可以通过元表来改变。 以索引方式访问一个变量 t[i] 等价于 调用 gettable_event(t,i)。 ,有一份完整的关于 gettable_event 函数的说明。 这个函数并没有在 lua 中定义出来,也不能在 lua 中调用。这里我们把提到它只是方便说明问题。)

varName 这种语法只是一个语法糖,用来表示 var["Name"]:

对全局变量 x 的 *** 作等价于 *** 作 _ENVx。 由于代码块编译的方式, _ENV 永远也不可能是一个全局名字

个名字可以指代一个全局变量也可以指代一个局部变量 (或者是一个函数的形参,这是一种特殊形式的局部变量)。

名字指 程序中定义的标识符。

所有没有显式声明为局部变量 的变量名都被当做全局变量。 局部变量有其 作用范围 : 局部变量可以被定义在它作用范围中的函数自由使用。

以上就是关于如何在vsvisualstudio调试环境下查看lua的调用栈,变量信息全部的内容,包括:如何在vsvisualstudio调试环境下查看lua的调用栈,变量信息、lua 如何 读取文本的每一行,输入到指定的变量里、lua语言盘符名字能不能读取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10126574.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存