在Linux用GDB调试lua源码实践
前提:已经下载好lua 5.1.4
目录结构
/data
–lua
----lua-5.1.4
----test
为了可以调试源码,编译lua时要给加上-g 和 O2改成O0
[jh@localhost src]$ pwd
/data/lua/lua-5.1.4/src
[jh@localhost src]$ vim Makefile
把这行改成这样
CFLAGS= -O0 -Wall -g $(MYCFLAGS)
编译安装 lua 5.1.4
[jh@localhost lua-5.1.4]$ pwd
/data/lua/lua-5.1.4
[jh@localhost lua-5.1.4]$ make clean
…各种信息…
[root@localhost lua-5.1.4]# make linux test
…各种信息…
Hello world, from Lua 5.1!
安装完成
安装完毕后:查看安装的文件所在目录信息
[jh@localhost lua-5.1.4]$ make echo
These are the parameters currently set in src/Makefile to build Lua 5.1.4:
PLAT = none
CC = gcc
CFLAGS = -O0 -Wall -g
AR = ar rcu
RANLIB = ranlib
RM = rm -f
MYCFLAGS =
MYLDFLAGS =
MYLIBS =
These are the parameters currently set in Makefile to install Lua 5.1.4:
PLAT = none
INSTALL_TOP = /usr/local
INSTALL_BIN = /usr/local/bin
INSTALL_INC = /usr/local/include
INSTALL_LIB = /usr/local/lib
INSTALL_MAN = /usr/local/man/man1
INSTALL_LMOD = /usr/local/share/lua/5.1
INSTALL_CMOD = /usr/local/lib/lua/5.1
INSTALL_EXEC = install -p -m 0755
INSTALL_DATA = install -p -m 0644
See also src/luaconf.h .
第N步:在目录/data/lua/test下新建若干文件
在此目录写测试代码
第N步:新建C++文件,test.cpp 用来执行一个lua文件,lua文件用参数传入
#include <stdio.h>
extern "C"{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
int main(int argc, char* argv[])
{
char* file = NULL;
file = argv[1];
printf("loaded file=%s\n", argv[1]);
lua_State* L = lua_open();
luaL_openlibs(L);
luaL_dofile(L, file);
return 0;
}
新建lua文件,my.lua 用来用作被调用的lua文件
local a = 1111
print("ok", a)
新建build.sh用来编译test.cpp 生成的可执行文件叫bin
[jh@localhost test]$ pwd
/data/lua/test
[jh@localhost test]$ vim build.sh
g++ -g -I/usr/local/include -L/usr/local/lib -llua -ldl -lm -o bin test.cpp /usr/local/lib/liblua.a
新建run.sh用来运行bin文件和my.lua
[jh@localhost test]$ pwd
/data/lua/test
[jh@localhost test]$ vim run.sh
./bin my.lua
先运行build.sh编译bin, 再运行run.sh
[jh@localhost test]$ sh build.sh
[jh@localhost test]$ sh run.sh
loaded file=my.lua
ok 1111
[jh@localhost test]$
结果正常
接下来可以开始GDB
[root@localhost test]# pwd
/data/lua/test
[root@localhost test]# gdb bin
…一堆吧啦吧啦…
(gdb) b luaK_code
Breakpoint 1 at 0x419b03: file lcode.c, line 798.
(gdb) r my.lua
Starting program: /data/lua/test/bin my.lua
loaded file=my.lua
Breakpoint 1, luaK_code (fs=0x7fffffffc030, i=1, line=1) at lcode.c:798
798 Proto *f = fs->f;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libgcc-4.4.7-17.el6.x86_64 libstdc+±4.4.7-17.el
.x86_64
(gdb) bt
#0 luaK_code (fs=0x7fffffffc030, i=1, line=1) at lcode.c:798
#1 0x0000000000419c93 in luaK_codeABx (fs=0x7fffffffc030, o=OP_LOADK, a=0, bc=0) at lcode.c:823
#2 0x00000000004187b7 in discharge2reg (fs=0x7fffffffc030, e=0x7fffffffbf70, reg=0) at lcode.c:359
#3 0x00000000004188b6 in exp2reg (fs=0x7fffffffc030, e=0x7fffffffbf70, reg=0) at lcode.c:391
#4 0x0000000000418a7f in luaK_exp2nextreg (fs=0x7fffffffc030, e=0x7fffffffbf70) at lcode.c:418
#5 0x000000000040c468 in adjust_assign (ls=0x7fffffffc290, nvars=1, nexps=1, e=0x7fffffffbf70) at lparser.c:266
#6 0x000000000040edc0 in localstat (ls=0x7fffffffc290) at lparser.c:1193
#7 0x000000000040f1da in statement (ls=0x7fffffffc290) at lparser.c:1305
#8 0x000000000040f253 in chunk (ls=0x7fffffffc290) at lparser.c:1330
#9 0x000000000040cd4c in luaY_parser (L=0x631010, z=0x7fffffffc550, buff=0x7fffffffc4f8, name=0x638e88 “@my.lua”) at lparser.c:391
#10 0x0000000000407d56 in f_parser (L=0x631010, ud=0x7fffffffc4f0) at ldo.c:497
#11 0x00000000004067b7 in luaD_rawrunprotected (L=0x631010, f=0x407cc7 <f_parser>, ud=0x7fffffffc4f0) at ldo.c:116
#12 0x0000000000407c0a in luaD_pcall (L=0x631010, func=0x407cc7 <f_parser>, u=0x7fffffffc4f0, old_top=32, ef=0) at ldo.c:463
#13 0x0000000000407ea5 in luaD_protectedparser (L=0x631010, z=0x7fffffffc550, name=0x638e88 “@my.lua”) at ldo.c:513
#14 0x000000000040419f in lua_load (L=0x631010, reader=0x4173b6 , data=0x7fffffffc5a0, chunkname=0x638e88 “@my.lua”)
at lapi.c:869
#15 0x00000000004176e0 in luaL_loadfile (L=0x631010, filename=0x7fffffffe904 “my.lua”) at lauxlib.c:581
#16 0x00000000004020a4 in main (argc=2, argv=0x7fffffffe6d8) at test.cpp:18