1. makefile 文件的简要分析

LUA_A=	liblua.a
CORE_O=	lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o
LIB_O=	lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o 
BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS)

LUA_T=	lua
LUA_O=	lua.o gdb_print.o

LUAC_T=	luac
LUAC_O=	luac.o

ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O)
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) 
ALL_A= $(LUA_A)

# Targets start here.
default: $(PLAT)

all:	$(ALL_T)

o:	$(ALL_O)

a:	$(ALL_A)

$(LUA_A): $(BASE_O)
	$(AR) $@ $(BASE_O)
	$(RANLIB) $@

$(LUA_T): $(LUA_O) $(LUA_A)
	$(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)

$(LUAC_T): $(LUAC_O) $(LUA_A)
	$(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)
  1. 先看all的依赖,可以看到这个变量是"liblua.a lua luac"。这是lua这个项目中生成的三个文件一个静态库两个执行文件
  2. 再看$(LUA_A)的生成规则,除了luac.c和lua.c文件,其他的文件都是用来生成lualib库
  3. 其他两个生成规则是差不多的,就是相应的.c文件加上一个lualib库。

2.在vs中创建lua项目

  • 创建一个空的解决方案,然后再创建三个项目
  • LuaStudio 调试程序_LuaStudio 调试程序

  • lualib用来生成lib库
    readlua生成lua.exe
    luac生成luac.exe
  • 添加文件
    lualib的文件是除了luac.c和lua.c以为的文件
  • LuaStudio 调试程序_LuaStudio 调试程序_02

  • 其他两个相对简单
  • LuaStudio 调试程序_LuaStudio 调试程序_03

  • 但记得设置依赖lualib库和头文件路径
  • 设置依赖关系
  • LuaStudio 调试程序_lua_04


  • LuaStudio 调试程序_windows_05

  • 之后一键生成就行了。

LuaStudio 调试程序_开发语言_06

3.调试lua

设置readlua为启动项目

在属性->调试->命令参数 设置lua解析的文件

LuaStudio 调试程序_解决方案_07

4.辅助调试

看过我之前的文章的知道我在gdb调试中写了一些调试lua的辅助脚本

比如打印lua变量,table,解析指令等等

LuaStudio 调试程序_windows_08


LuaStudio 调试程序_LuaStudio 调试程序_09


LuaStudio 调试程序_开发语言_10


这两天在看vs有没有类似的手段,最后发现vs有即时窗口。

在即时窗口中可以调用c函数

这篇博客主要记录我在使用vs即时窗口中遇到的问题。

  1. 在gdb中可以使用‘p’命令调用c函数,因此在之前我把要调试要使用的函数都放到了gdb_print.c这个文件中,这个文件中的函数在整个lua项目中是没有用到的,在vs编译完成后在即时窗口中输入这个文件中的函数名会发现没有这个符号。因此在vs环境中在lua使用这个文件中的函数
  2. 在即时窗口中调用这个函数,即使这个函数设置了断点但是vs并不会断下(这一点和gdb的’p’不一样,因此要调试辅助函数还是使用gdb方便)
  3. 在即时窗口中打印的字符串是直接输出转义字符

    这个情况没有找到好的解决方案,我的最终解决是设置了一个全局变量,把调试函数的输出都赋值到这个变量中,然后把这个全局变量添加到了监视中

    起初其实并没有想到这个方案,因为即时窗口中调用函数断点并不会命中,我以为在即时窗口中的调用是被特殊处理过的。但最后没有找到好的解决方案,还是回头去试出来了。