GDB 获取python程序堆栈

在调试python程序时,经常需要从gdb attach上去,跟踪stack信息。 虽然DebuggingWithGdb[https://wiki.python.org/moin/DebuggingWithGdb]提供了不错的方法,但是某些情况下还是需要gdb原始操作的。

typedef struct {
    PyObject_HEAD
    int co_argcount;        /* #arguments, except *args */
    int co_nlocals;     /* #local variables */
    int co_stacksize;       /* #entries needed for evaluation stack */
    int co_flags;       /* CO_..., see below */
    PyObject *co_code;      /* instruction opcodes */
    PyObject *co_consts;    /* list (constants used) */
    PyObject *co_names;     /* list of strings (names used) */
    PyObject *co_varnames;  /* tuple of strings (local variable names) */
    PyObject *co_freevars;  /* tuple of strings (free variable names) */
    PyObject *co_cellvars;      /* tuple of strings (cell variable names) */
    /* The rest doesn't count for hash/cmp */
    PyObject *co_filename;  /* string (where it was loaded from) */
    PyObject *co_name;      /* string (name, for reference) */
    int co_firstlineno;     /* first source line number */
    PyObject *co_lnotab;    /* string (encoding addr<->lineno mapping) See
                   Objects/lnotab_notes.txt for details. */
    void *co_zombieframe;     /* for optimization only (see frameobject.c) */
    PyObject *co_weakreflist;   /* to support weakrefs to code objects */
} PyCodeObject;

其中重要的是:co_filename(文件名), co_firstlineno(首行), co_name(函数名)。

如果通过gdb拿到以下stack:

#0  0x000000395bee8f63 in epoll_wait () from /lib64/libc.so.6
#1  0x00007feb949885de in pyepoll_poll (self=0x7feb9c2acc00, args=<optimized out>, kwds=<optimized out>) at /n/filer3b/home/sqa/xuezhang/tickets/SCM-979/software-SCM-1280/Python-2.7.11/Modules/selectmodule.c:1034
#2  0x00000000004a2fc1 in call_function (pp_stack=<optimized out>, oparg=<optimized out>) at Python/ceval.c:4350
#3  0x00000000004a2fc1 in PyEval_EvalFrameEx (f=0x2b67fc0, throwflag=<optimized out>)
#4  0x00000000004a4890 in PyEval_EvalCodeEx (co=0x7feb94749630, globals=<optimized out>, locals=<optimized out>, args=0x7feb91a3f1d8, argcount=1, kws=0x7feb91a3f1e0, kwcount=0, defs=0x0, defcount=0, closure=0x0) at Python/ceval.c:3582
#5  0x00000000004a2c0e in call_function (pp_stack=<optimized out>, oparg=<optimized out>) at Python/ceval.c:4445
#6  0x00000000004a2c0e in PyEval_EvalFrameEx (f=0x7feb91a3f050, throwflag=<optimized out>)
#7  0x00000000004a3857 in call_function (pp_stack=<optimized out>, oparg=<optimized out>) at Python/ceval.c:4436
#8  0x00000000004a3857 in PyEval_EvalFrameEx (f=0x7feb9c2c2050, throwflag=<optimized out>)
#9  0x00000000004a4890 in PyEval_EvalCodeEx (co=0x7feb9c0ab730, globals=<optimized out>, locals=<optimized out>, args=0x0, argcount=0, kws=0x0, kwcount=0, defs=0x0, defcount=0, closure=0x0) at Python/ceval.c:3582
#10 0x00000000004a4a12 in PyEval_EvalCode (co=0x5, globals=0x2d36f50, locals=0x3ff) at Python/ceval.c:669
#11 0x00000000004c9983 in run_pyc_file (fp=<optimized out>, filename=<optimized out>, globals=0x2d36f50, locals=0x3ff, flags=<optimized out>) at Python/pythonrun.c:1400
#12 0x00000000004c9983 in PyRun_SimpleFileExFlags (fp=0x2586930, filename=<optimized out>, closeit=<optimized out>, flags=0x7ffd20d1d21c)
#13 0x0000000000414dd6 in Py_Main (argc=<optimized out>, argv=0x7ffd20d1d3c8) at Modules/main.c:640
#14 0x000000395be1ed5d in __libc_start_main () from /lib64/libc.so.6
#15 0x00000000004141da in _start ()

PyEval_EvalCodeEx(PyCodeObject* co, ...), 第一个参数函数含有我们需要的信息。
p ((PyCodeObject*)0x7feb9c0ab730)->co_firstlineno    得到首行行号: 3
x /50sb (PyStringObject*)(((PyCodeObject*)0x7feb9c0ab730)->co_name)  打印一系列字符串, 可以得到函数名:  module
x /50sb (PyStringObject*)(((PyCodeObject*)0x7feb9c0ab730)->co_filename) 打印一系列字符串,可以得到文件名: ./backend/run.py

原文地址:https://www.cnblogs.com/espzest/p/10432378.html

时间: 2024-09-30 09:04:18

GDB 获取python程序堆栈的相关文章

用GDB排查Python程序故障

某Team在用Python开发一些代码,涉及子进程以及设法消除僵尸进程的需求.实践中他们碰上Python程序非预期退出的现象.最初他们决定用GDB调试Python解释器,查看exit()的源头.我听了之后,觉得这个问题应该用别的调试思路.帮他们排查这次程序故障时,除去原始问题,还衍生了其他问题. 这次的问题相比西安研发中心曾经碰上的Python信号处理问题,有不少基础知识.先验知识是共用的,此处不做再普及,感兴趣的同学可以翻看我以前发过的文章. 下文是一次具体的调试.分析记录.为了简化现场.方便

[python] 像gdb一样用pdb debug python程序

如题,我们希望像gdb C程序一样.对python程序就行debug 可以使用pdb来实现这样的功能. 见:https://docs.python.org/3/library/pdb.html 最简单的方法,我们以longest_substring.py为例. 使用如下方式执行它,便进入了debug模式: ┬─[[email protected]:~/Src/copyleft/algorithm/string]─[11:37:33 AM] ╰─>$ python -m pdb longest_s

gdb调试多线程程序总结

http://www.cnblogs.com/aixingfou/archive/2011/07/28/2119875.html http://blog.csdn.net/nancygreen/article/details/14226925 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. thread ID 切换当前调试的线程为指定ID的线程. b

Python程序的常见错误(收集篇)

关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Application Development)中颇为受欢迎,同时Python还能作为脚本语言或者胶水语言讲现成的组件或者服务结合起来.Python支持模块(modules)和包(packages),所以也鼓励程序的模块化以及代码重用. 关于本文 Python简单.易学的语法可能会误导一些Python程序员(特别是那些

python 调 用另一个python 程序

na = int(input("开奖时间(如:20140630): \n")) import time nb =  int(time.strftime("%Y%m%d")) #获取当前时间的年月日 #print (nb) #获取键盘输入 a = True while a:     if nb < na:         import os         os.system("python shuangseqou.py")         

CSDN日报20170319——《人工智能风口, Python 程序员的狂欢与企业主的哀嚎》

[程序人生]人工智能风口, Python 程序员的狂欢与企业主的哀嚎 作者:赖勇浩 人工智能风口有多火?估计很多人已经感受到了,我在这里引用一下新智元的报道: "2017年短短不到三个月的时间,国内AI获投项目已有36个,千万级别融资占据半数以上." 嗯,就是那么霸道.两会刚刚结束,"人工智能"首次被列入政府工作报告,随之而来的是人工智能板块领跑大盘涨势,无疑,这一切将刺激人工智能在多个领域的全面发展. [深度学习]NeuralFinder :集成人工生命和遗传算法

作业:老板现在给你任务,公司有haproxy配置文件,希望通过python程序可以对ha配置文件进行增删改

1 # 老板现在给你任务,公司有haproxy配置文件,希望通过python程序可以对ha配置文件进行增删改 2 #分析:对文件进行增删改,首先需要找到需要修改文件的位置,即必须先把文件读取出来,找到对应 3 #位置,进行内容的修改,增加和删除: 4 import json,os #json模块用于将用户输入的字符串转换为字典 5 6 #首先定义fetch函数,同时传入指定参数backend,用来将修改的地方找出来 7 def fetch(backend): 8 flag=False #定义fl

Python程序员的10个常见错误(转)

add by zhj:虽然学Python也有两年了,但这些问题的确容易犯,看来对Python的理解还有些地方不深入.先转了,有时间再好好看 译文:http://blog.jobbole.com/68256/ 本文由 伯乐在线 - datorhjaelten 翻译.未经许可,禁止转载!英文出处:toptal.欢迎加入翻译小组. 关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Ra

Python 程序员经常犯的 10 个错误

关于PythonPython是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得... 关于Python Python是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得它在快速应用开发中非常有吸引力,并且可作为脚本或胶水语言来连接现有的组件或服务.Python支持模块和包,从而鼓励了程序的模块化和代码重用. 关于这篇文章 Python简单易学的语法可能会使Python开发