项目作者: esrrhs

项目描述 :
类似gdb的lua调试器。Lua debugger like gdb
高级语言: C++
项目地址: git://github.com/esrrhs/dLua.git
创建时间: 2020-11-21T08:15:54Z
项目社区:https://github.com/esrrhs/dLua

开源协议:MIT License

下载


dLua



类似gdb的lua调试器

特性

  • 支持Linux平台
  • C++编写
  • 通过附加到其他进程上,进行调试
  • gdb风格的调试指令,包括设置条件断点、查看变量、设置变量

编译

  • 下载编译安装lua
  • 用脚本编译dlua,生成dluadluaagent.sodlua是控制台,dluaagent.so是调试插件
    1. # ./build.sh
  • 下载编译hookso,生成hooksohookso是注入工具
  • 最后将dluadluaagent.sohookso放在同级目录即可使用

使用

  • 找到目标进程pid,也可以使用项目中的示例代码。假设pid=1234

    1. # lua test.lua
  • 运行dlua,附加到1234进程,出现如下提示,说明连接正常,可以开始调试

    1. # ./dlua 1234
    2. attack to 1234 ok, use ctrl+c to input command, eg: h
  • 输入ctrl+c,输入h回车查看帮助

    1. (dlua) h
    2. h help commands
    3. q quit
    4. bt show cur call stack
    5. b add breakpoint, eg: b test.lua:123
    6. i show info, eg: i b
    7. n step next line
    8. s step into next line
    9. c continue run
    10. dis disable breakpoint, eg: dis 1
    11. en enable breakpoint, eg: en 1
    12. d delete breakpoint, eg: d 1
    13. p print exp value, eg: p _G.xxx
    14. l list code
    15. f select stack frame
    16. fin finish current call
    17. set set value, eg: set aa=1
    18. r run code, eg: r print("test")
  • 其他命令同理,输入ctrl+c,输入命令即可

    1. (dlua) bt
    2. 0 in string_time_to_unix_time at test.lua:23
    3. 1 in ? at test.lua:50
    4. 2 in ? at [C]:-1
  • 退出,则输入q

    1. (dlua) q
    2. #

命令

h

帮助

q

退出

bt

查看调用堆栈

b

打断点,打在某个文件某一行

  1. b test.lua:34

打在当前文件的某一行

  1. b 34

打在当前正执行到的行

  1. b

打在某个函数的入口

  1. b string_time_to_unix_time_with_tz

打在某个嵌套函数的入口

  1. b _G.test.getweekstart_by_tz_test

条件断点,方括号的tz表示需要的参数,作为输入参与到后面的表达式计算

  1. b string_time_to_unix_time_with_tz if [tz] tz==800

i

罗列当前的断点

  1. i b

n

下一行,如果当前位置是函数,则跳过内部

s

下一行,如果当前位置是函数,则跳进内部

c

取消步进,继续执行

dis

取消断点,取消某个断点

  1. dis 1

取消所有断点

  1. dis

en

生效断点,生效某个断点

  1. en 1

生效所有断点

  1. en

d

删除断点,删除某个断点

  1. d 1

删除所有断点

  1. d

p

查看当前栈的变量,如

  1. p year

或者全局的

  1. p _G.test

或者复杂的,查看table中的某一项,[]表示需要传入的变量,作为输入参与到后面的表达式计算

  1. p [tmp] tmp.abc

l

查看当前栈的附近代码,如

  1. l

查看附近20行的代码

  1. l 20

f

设置当前栈帧,具体编号从bt查看,如

  1. f 0

fin

跳过执行当前函数

set

设置当前栈的变量,如

  1. set year=1234

或者全局的

  1. set _G.test = 123

或者复杂的,设置table中的某一项,[]表示需要传入的变量,作为输入参与到后面的表达式计算

  1. set [tmp] tmp.abc = 1

r

运行特定代码

  1. r print(123)

运行复杂代码,加上变量,[]表示需要传入的变量,作为输入参与到后面的表达式计算

  1. r [tmp] tmp[1]=2

其他

lua全家桶