在Linux用GDB调试lua源码实践

在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

调用栈打印出来了,可以继续跟代码了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值