1
11
2014
5

使用 inspect.lua 查找 Awesome 配置引入的内存泄漏

本文来自依云's Blog,转载请注明。

所谓「相见恨晚」,说的就是我第一次看到 inspect.lua 的感觉啊!Lua 这个超小型主打嵌入的语言,连 Readline 都要第三方库来支持,自然是没 Python 那样的补全功能了。不仅如此,连一个展示其数据结构的函数都没有。包括自己在内,不少人零零散散写过各种打印 Lua 表的函数,但像 inspect.lua 这样子优秀的还是第一次见到。

基本用法啊示例什么的不说了,直接在对象上调用 inspect 函数就可以得到一个(可能是巨大的但一定不会是无限的)字符串表示,递归的结构会依据其类型和一个序号来辨识。

既得此神器,自然要用来看看我那自从升级到 3.5 版本之后就一直在慢慢泄漏内存的 Awesome 了:

>>> awesome-client
awesome#inspect = dofile('tmpfs/inspect.lua')
awesome#f = io.open('tmpfs/output.lua', 'w')
awesome#f:write(inspect(_G))
awesome#f:close()
awesome#f = nil

然后就是慢慢察看了。我注意到了这么一个变量:

  raise_on_click = {
    [<client 13>] = true,
    [<client 12>] = true,
    [<client 14>] = true,
    [<client 15>] = true,
    [<client 16>] = true,
    [<client 17>] = true,
    [<client 18>] = true,
    [<client 19>] = true,
    [<client 20>] = true,
    [<client 21>] = true,
    ...
  }

这个变量由来已久,好像现在已经偏离了当初的设计目的了……不管它,反正呢,它里边保留了所有 Awesome 正管理的客户端对象,有 100 多个呢。可是,我怎么会同时有那么多窗口呢,明明才十几个啊?

检查一下配置文件,终于知道问题在哪里了:

diff --git a/rc.lua b/rc.lua
index ad06296..c1422bd 100644
--- a/rc.lua
+++ b/rc.lua
@@ -991,7 +991,7 @@ end)
 client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
 client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)

-client.add_signal("unmanage", function(c)
+client.connect_signal("unmanage", function(c)
     raise_on_click[c] = nil
 end)
 -- }}}

add_signal是 Awesome 3.4 的用法,3.5 应该用connect_signal才对。这里的client.add_signal是 Awesome 自己用的另外一个意思的函数……

Category: 编程 | Tags: Lua awesome | Read Count: 10575
adam8157 说:
Jan 11, 2014 11:24:19 PM

咱每次升级都会把自己的配置, 原默认配置和新默认配置diff3一下

Avatar_small
依云 说:
Jan 12, 2014 12:29:16 AM

原来还有 diff3~我是升级之后就没原默认配置了,于是就只两方合并了……

farseerfc 说:
Jan 27, 2014 04:10:09 AM

請問怎麼解決awesome裏gtk3的打開對話框會留在窗口列表的問題?似乎我只能重新載入awesome解決……

Avatar_small
依云 说:
Jan 27, 2014 12:23:48 PM

我试过 gedit 的「打开」对话框了,没有重现。
你具体是哪个程序的哪个对话框会出现这个问题嘛,awesome 的版本是?

farseerfc 说:
Jan 27, 2014 02:32:44 PM

抱歉我沒說清楚。我發現問題的是Awesome3.4,在用meld的打開對話框的時候。同樣的awesome3.4在gedit的about對話框和nautilus的about對話框也有類似的問題……剛纔去試了一下awesome3.5,沒有這個問題。看來估計是我自己的awesome3.4的配置出問題了……


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com