前言

前几天我自己定义了一个打印table的函数,并且把实现的细节都总结在了这里—— Lua 自定义打印table函数 ,自己定义的函数一定要找一个用武之地,于是我决定拿Lua的灵魂——_G表开刀,在输出的过程中还出现了一点点问题,因此总结下来和大家分享一下。

过程

首先我是知道_G有一个字段是_G,即_G._G =_G(怎么这么变态),于是我知道这样可能会导致死循环,于是在递归table之前先判断table的名字是否是_G,如果是就直接返回,就在我认为没问题的时候,灾难还是发生了。

我发现程序运行起来以后,一个CPU占用率瞬间到达100%,一开始我还没有在意,以为这个_G表太大了,于是等了一会儿,当我发现输出文件超过300M时果断懵逼了,这绝对是死循环了啊,一个表中的内容再多,也不至于多的这样离谱,于是我手动杀死了进程。

面对300M的文本文件没有什么可怕的,拿出我的法宝Sublime Text文本编辑器打开,我发现确实是死循环了,因为_G表中不仅仅有_G,还有一个package.loaded表,这个表就是环境中已经加载的内容,结果_G.package.loaded中还有_G.package.loaded就死循环了,当我把这种情况去掉以后就可以正常的输出结果了,其中的_G._G_G.package.loaded我只输出了空表,并不是实际的内容,其他都是正常内容。

结果

_G
├── string:
|    ├── sub: function: 006AEB70
|    ├── upper: function: 006AEBB8
|    ├── len: function: 006AE290
|    ├── gfind: function: 006AE170
|    ├── rep: function: 006AE3F8
|    ├── find: function: 006ADFC0
|    ├── match: function: 006AE368
|    ├── char: function: 006ADEA0
|    ├── dump: function: 006ADF30
|    ├── gmatch: function: 006AE170
|    ├── reverse: function: 006AE440
|    ├── byte: function: 006ADE10
|    ├── format: function: 006AE050
|    ├── gsub: function: 006AE200
|    └── lower: function: 006AE2D8
├── xpcall: function: 006AA630
├── package:
|    ├── preload:
|    |    └── { }
|    ├── loadlib: function: 006AAD80
|    ├── loaded:
|    |    └── { }
|    ├── loaders:
|    |    ├── 1] function: 006AAEA0
|    |    ├── 2] function: 006AAEE8
|    |    ├── 4] function: 006AAF78
|    |    └── 3] function: 006AAF30
|    ├── cpath: ".\\?.dll;H:\\Program Files (x86)\\Lua\\?.dll;H:\\Program Files (x86)\\Lua\\loadall.dll"
|    ├── config: "\\\n;\n?\n!\n-"
|    ├── path: ".\\?.lua;H:\\Program Files (x86)\\Lua\\lua\\?.lua;H:\\Program Files (x86)\\Lua\\lua\\?\\init.lua;H:\\Program Files (x86)\\Lua\\?.lua;H:\\Program Files (x86)\\Lua\\?\\init.lua"
|    └── seeall: function: 006AAE10
├── tostring: function: 006AA480
├── print: function: 004CE518
├── dumptree: function: 004D97C8
├── os:
|    ├── exit: function: 006AD9D8
|    ├── setlocale: function: 006ADBD0
|    ├── date: function: 006AD828
|    ├── getenv: function: 006ADA68
|    ├── difftime: function: 006AD8B8
|    ├── remove: function: 006ADAF8
|    ├── time: function: 006ADC60
|    ├── clock: function: 006AD798
|    ├── tmpname: function: 006ADCF0
|    ├── rename: function: 006ADB40
|    └── execute: function: 006AD948
├── unpack: function: 006AA5A0
├── require: function: 006AB248
├── getfenv: function: 004CE170
├── setmetatable: function: 006AA3A8
├── next: function: 004CE3F8
├── assert: function: 004CDEE8
├── tonumber: function: 006AA3F0
├── io:
|    ├── lines: function: 006ACD10
|    ├── write: function: 006AD028
|    ├── close: function: 006ACBF0
|    ├── flush: function: 006ACC38
|    ├── open: function: 006ACD58
|    ├── output: function: 006ACDE8
|    ├── type: function: 006ACFE0
|    ├── read: function: 006ACF08
|    ├── stderr: file (0FE91428)
|    ├── stdin: file (0FE913E8)
|    ├── input: function: 006ACC80
|    ├── stdout: file (0FE91408)
|    ├── popen: function: 006ACE78
|    └── tmpfile: function: 006ACF50
├── rawequal: function: 004CE5A8
├── collectgarbage: function: 004CDF78
├── arg:
|    ├── -1] "H:/Program Files (x86)/Lua/lua_interpreter.exe"
|    └── 0] "F:\\gtest.lua"
├── getmetatable: function: 004CE200
├── module: function: 006AB1B8
├── rawset: function: 004CE6C8
├── math:
|    ├── log: function: 006AF428
|    ├── max: function: 006AF470
|    ├── acos: function: 006AED20
|    ├── huge: 1.#INF
|    ├── ldexp: function: 006AF308
|    ├── pi: 3.1415926535898
|    ├── cos: function: 006AF080
|    ├── tanh: function: 006AF8A8
|    ├── pow: function: 006AF590
|    ├── deg: function: 006AF0C8
|    ├── tan: function: 006AF938
|    ├── cosh: function: 006AEFF0
|    ├── sinh: function: 006AF740
|    ├── random: function: 006AF620
|    ├── randomseed: function: 006AF6B0
|    ├── frexp: function: 006AF278
|    ├── ceil: function: 006AEF60
|    ├── floor: function: 006AF158
|    ├── rad: function: 006AF5D8
|    ├── abs: function: 006AECD8
|    ├── sqrt: function: 006AF818
|    ├── modf: function: 006AF500
|    ├── asin: function: 006AEDB0
|    ├── min: function: 006AF4B8
|    ├── mod: function: 006AF1E8
|    ├── fmod: function: 006AF1E8
|    ├── log10: function: 006AF398
|    ├── atan2: function: 006AEE40
|    ├── exp: function: 006AF110
|    ├── sin: function: 006AF7D0
|    └── atan: function: 006AEED0
├── debug:
|    ├── getupvalue: function: 004CF670
|    ├── debug: function: 006AFA58
|    ├── sethook: function: 004CF748
|    ├── getmetatable: function: 004CF628
|    ├── gethook: function: 006AFAE8
|    ├── setmetatable: function: 004CF868
|    ├── setlocal: function: 004CF7D8
|    ├── traceback: function: 004CF940
|    ├── setfenv: function: 004CF700
|    ├── getinfo: function: 004CF478
|    ├── setupvalue: function: 004CF8B0
|    ├── getlocal: function: 004CF508
|    ├── getregistry: function: 004CF598
|    └── getfenv: function: 006AFAA0
├── pcall: function: 004CE488
├── table:
|    ├── setn: function: 006AC4E8
|    ├── insert: function: 006AC3C8
|    ├── getn: function: 006AC2A8
|    ├── foreachi: function: 006AC218
|    ├── maxn: function: 006AC338
|    ├── foreach: function: 006AC188
|    ├── concat: function: 006AC0F8
|    ├── sort: function: 006AC578
|    └── remove: function: 006AC458
├── newproxy: function: 006A8E40
├── type: function: 006AA510
├── coroutine:
|    ├── resume: function: 006AA990
|    ├── yield: function: 006AABD0
|    ├── status: function: 006AAAB0
|    ├── wrap: function: 006AAB40
|    ├── create: function: 006AA900
|    └── running: function: 006AAA20
├── _G:
|    └── { }
├── select: function: 004CE758
├── gcinfo: function: 004CE0E0
├── pairs: function: 006A8DE8
├── rawget: function: 004CE638
├── loadstring: function: 004CE368
├── ipairs: function: 006A18F8
├── _VERSION: "Lua 5.1"
├── dofile: function: 004CDFC0
├── setfenv: function: 004CE7E8
├── load: function: 004CE2D8
├── error: function: 004CE050
└── loadfile: function: 004CE248

总结

  • 遇到实际的问题可以先猜一下原因,然后通过代码来证明你的猜想是否正确。

Lua利用自定义函数打印_G内容相关推荐

  1. 自定义_Excel中的自定义函数(自定义函数的基础内容)

    各位朋友,你们好. 最近和网友沟通交流Excel问题,好些问题都没法直接实现,因此用了很多自定义函数,也给头条里的朋友写过几个自定义函数(比如颜色计算的函数.提取不重复内容的函数.汉字转拼音的函数-- ...

  2. 利用自定义函数实现批量爬取多家公司的新闻

    1 需求 利用自定义函数实现批量爬取多家公司的新闻. 2 代码实现 from selenium import webdriver import redef dongfang(company):chro ...

  3. javascript利用自定义函数向页面输出自定义的表格,在调用函数时通过传递的参数指定表格的行数

    利用自定义函数向页面中输出自定义的表格 <!DOCTYPE html> <html lang="en"> <head><script ty ...

  4. oracle体育成绩字段,在Excel中利用自定义函数处理体育达标成绩

    一.建立标准查分表 首先是根据<国家体育锻炼标准评分表>以16岁男子(高中一年级)为例,在Excel中建立标准评分表,把工作表命名为"评分表",建立该表的目的是为了编制 ...

  5. 如何利用自定义函数把阳历转换成阴历

    数据库保存的是阳历日期,有时候会遇到把阳历换成阴历的需求,例如下图把阳历转换成阴历. 这个问题是我在开发报表过程中遇到的一个小需求,利用的工具是FineReport8.0版本,解决思路是首先定义一个可 ...

  6. 如何利用自定义函数把阳历转换成阴历 1

    数据库保存的是阳历日期,有时候会遇到把阳历换成阴历的需求,例如下图把阳历转换成阴历. 这个问题是我在开发报表过程中遇到的一个小需求,利用的工具是FineReport8.0版本,解决思路是首先定义一个可 ...

  7. pytorch 中 利用自定义函数 get_mask_from_lengths(lengths, max_len)获取每个batch的mask

    在pytorch中,经常会需要通过batch进行批量处理数据,由于每个batch中各个样本之间存在差异,经常会需要进行先padding后mask的操作. 尤其是在自然语言处理任务中,每个batch中的 ...

  8. 微信小程序开发4——利用自定义组件实现页面内容切换功能

    首先展示一下要显示的功能:` 首先需要在开发者工具中新建一个文件夹(components),分别在文件夹中新建.js .json .wxml .wxcss四个文件(可以右键文件夹,选择新建新建(com ...

  9. jqprint 分页打印_利用jqprint插件打印页面内容的实现方法

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

最新文章

  1. 如何让Git适应敏捷开发流程?
  2. SAP 往一个角色里增加事务代码
  3. 谨慎能捕千秋蝉(二)——CSRF
  4. DL框架之PyTorch:深度学习框架PyTorch的简介、安装、使用方法之详细攻略
  5. Mysql中怎样使用update更新某列的数据减去指定值
  6. 读谷歌编码规范所想到的
  7. Linux中断子系统-通用框架处理
  8. SQL点滴系列之删除数据(五)
  9. linux 线程 waitforsingleobject,用Sleep或WaitForSingleObject实现线程的休眠 | 求索阁
  10. 使用JavaScript获取设备屏幕的宽度
  11. 怎么用计算机做求余,怎样用计算器求余数
  12. GBase8s数据库MINUS 运算符
  13. 如何创建一个简易的HTML网页框架
  14. Pycharm下载与安装教程
  15. css基础-属性值计算过程
  16. 【一周书讯】网络安全、云计算、人工智能、大数据一网打尽
  17. Bugku CRYPTO No Ciphertext RSA writeup by 树木
  18. 一个IP账号,为啥通过路由器就可供多人同时使用?
  19. 什么是绿色工厂?申报绿色工厂对企业有什么好处?
  20. 负数补码表示范围以及规格化数

热门文章

  1. Javascript 16进制转有符号的10进制整数
  2. 今天用Excel做一颗圣诞树,小伙伴们都惊呆了!
  3. SQL2008附加数据库时出错的解决办法
  4. linux命令---top
  5. 90后都会选择的购车模式“网上购车平台一成首付”
  6. 爬取听书网有声小说音频数据
  7. 综合评价理想解法(TOPSIS解法)
  8. Golang源码探究 —— 网络轮询器netpoller
  9. 自动控制原理->绪论
  10. 60个可爱的云图案设计,激发你的灵感