[✔️] lua profile细节逻辑

简介: [✔️] lua profile细节逻辑

lua_Debug的namewhat字段


  • "global":表示该名称是全局变量,在 Lua 中使用 _G 表来存储所有的全局变量。


  • "local":表示该名称是当前函数的局部变量,仅在当前函数内可见。


  • "method":表示该名称是某个表的方法,即该名称所处的函数是一个表的元方法或者其它方法。


  • "field":表示该名称是某个表的字段,即该名称所处的函数是一个表的元素。


  • 空字符串:表示该名称没有任何属性,可能是由于该名称不是一个有效的 Lua 变量或函数。


namewhat的2种属性对应的测试例


local m = {}
function m:test(i) # namewhat=method
    i = 10;
    print("test-abc")
end
function m.testField() # namewhat=field
    print("test-field")
end
return m;


捕获堆栈的关系以及每一层的消耗时间


在我之前的lua profile的实现逻辑中,我只对lua_Debug.what="Lua"的HOOK回调进行了捕获,大部分情况下,都能够得到正确的调用堆栈,因为function callfunction return是成对出现的。


但是总有个别情况,比如以下这个例子:


function getLocalTime()
    pcall(
        function()
            -- return require "socket"
        end
    )
end
getLocalTime()


hook回调值会触发了pcall的function call,虽然pcall是个C函数,但是并没有这个pcall的function return


因为我只关心lua_Debug.what=="Lua",所以这个pcall并没影响我的设计,无非是我无法知道pcall的存在。


我在function call的hook中记录当前的调用函数,在function return的hook回调中,是通过lua_Debug的一些数据,比如what、namewhat、functionName、sourFilePath、lineBegin、lineEnd等作为key,来判断是否为同一个函数,如果相等了,我就认为当前函数的call 和 return是配套的,即函数正确返回了,显然这么做,需要严格配套,很不巧,某些情况就是会出现不配套的调用,导致我的堆栈出现了异常。


hook不配对,除了lua hook的机制导致的,还有一个原因,就是我的function的判定key的生成有问题,当我尝试着将


return require "socket"


取消注释后,运行时我发现有时明明不是同一个函数,竟然key是一样的,本质上还是我的key规则有问题,我需要寻找更有代表性的数据作为key的基准数据。



目录
相关文章
|
6月前
|
存储 NoSQL 数据处理
Redis Lua脚本:赋予Redis更强大的逻辑与功能
Redis Lua脚本:赋予Redis更强大的逻辑与功能
145 0
|
消息中间件 NoSQL Redis
深入探究Redis事务和Lua脚本:实现原子操作与复杂业务逻辑
本篇深入剖析了Redis的事务处理和Lua脚本特性,为读者呈现了如何利用这两个功能来实现数据的原子操作和执行复杂的业务逻辑。我们首先介绍了Redis事务的概念和基本操作,通过MULTI、EXEC、DISCARD和WATCH等命令,展示了如何在一组命令中保持原子性。进一步,我们探讨了事务命令的使用方法,演示了如何在事务中监视键变化以及提交事务。
790 0
|
6月前
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
249 1
|
1月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
29 2
|
5月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
227 0
|
2月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
3月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
6月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
227 0
|
5月前
|
JSON 监控 数据格式
使用Lua代码扩展上网行为管理软件的脚本功能
本文介绍了如何使用Lua脚本增强上网行为管理,包括过滤URL、记录用户访问日志、控制带宽和自动提交监控数据到网站。Lua是一种轻量级语言,适合编写扩展脚本。文中提供多个示例代码,如URL过滤器、用户活动日志记录器和带宽控制器,帮助用户根据需求定制网络管理功能。通过这些示例,用户可以快速掌握Lua在上网行为管理中的应用。
172 4
|
5月前
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
198 0