cd ./deepin-software-center/src && sudo gdb python
Copy the Code
这个时候会在终端中看到一下内容:
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /usr/bin/python...(no debugging symbols found)...done.
(gdb)
比如一个浏览器要实现 cookie 的读取/保存以及代理功能, 就需要类似下面的代码:
但是软件中心在利用上面的代码进行浏览评论的时候会间歇性的 crash, 而且外部是用了 try ... except 捕获异常的, 所以第一反映是 C-level 的 crash 导致 Python 捕获不了异常。
像这种 C-level 的 crash, Python本身是无能为力的, 所以为了捕获这种异常就要用到 gdb.
下面是用 gdb 调试软件中心的方法:
1. cd 到软件中心目录并用 gdb 启动python
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /usr/bin/python...(no debugging symbols found)...done.
(gdb)
2. 用 gdb 启动软件中心:
3. 这个时候就可以像正常使用软件中心, 一旦软件中心发生了 C-level 的 crash 就会被 gdb 捕获到, 比如下面的错误:
这个一看就是 libgobject 动态库的函数调用引起的 crash, 但是怎样具体定位到特定的代码呢?
只需要在这个时候按一下 Ctrl + c 并键入 bt 就可以得到 crash 的堆栈了:
堆栈的阅读要从下往上读, 一般最上面的几行就是导致 crash 的函数, 比如上面的我们可以知道当软件中心调用 g_object_set 的函数导致的。
这样就好定位了, g_object_set 的就两行, 一行设置 cookie , 一行设置 proxy, 参数的类型没有错, 简单的推测应该是 g_object_set 设置了一个规定范围之外的值导致 crash 的, 这样我们修改一下代码在 g_object_set 之前就打印一下值:
最后发现是因为 soupCookie 的值是一个负数导致
到这里, 问题的原因知道了, 加一个条件进行保护一下:
到此就是对 ctypes 抛出异常进行诊断的整个流程, 希望大家以后遇到这类问题可以参考一下。
PS: gtk+ 3.0 是不存在这种问题的,因为 gtk+ 3.0 的可以直接调用 gi 相应的API并且在Python里面已经可以很好的捕捉异常。