调试器gdb评估表达式

时间:2016-08-21 21:37:57

标签: gdb

有eval功能吗?我读过“帮助”而我没找到

我想制作eval("gdb command")

因为我想使用这个方法创建我自己的grepping函数

How to grep on gdb print

我想制作eval($arg1)

2 个答案:

答案 0 :(得分:1)

有一个eval命令,但它并没有真正做到你想要的。它提供了一种有限的值替换形式的命令。

对于grep行的命令,我建议用Python编写。这样做比较容易。我们的想法是使用gdb.execute将命令的输出捕获到一个字符串中,然后使用Python来搜索你喜欢的字符串。如果从Python完成,您可以完全控制如何解析命令行,如果您使用gdb define命令则不然。

答案 1 :(得分:1)

奇怪的是,我今天早些时候为另一个question写了一个grep python gdb函数。这几个文件创建一个新命令,检查调用堆栈是否包含_malloc。对于其他字符串搜索和评估函数来说,这应该是一个非常好的开始。

这是gdb的脚本

# gdb script: pygdb-logg.gdb
# easier interface for pygdb-logg.py stuff
# from within gdb: (gdb) source -v pygdb-logg.gdb
# from cdmline: gdb -x pygdb-logg.gdb -se test.exe

# first, "include" the python file:
source -v pygdb-logg.py

# define shorthand for inMalloc():
define inMalloc
  python inMalloc()
end

这是python文件:

#!/usr/bin/python
# gdb will 'recognize' this as python
#  upon 'source pygdb-logg.py'
# however, from gdb functions still have
#  to be called like:
#  (gdb) python print logExecCapture("bt")

import sys
import gdb
import os

def logExecCapture(instr):
  # /dev/shm - save file in RAM
  ltxname="/dev/shm/c.log"

  gdb.execute("set logging file "+ltxname) # lpfname
  gdb.execute("set logging redirect on")
  gdb.execute("set logging overwrite on")
  gdb.execute("set logging on")
  gdb.execute("bt")
  gdb.execute("set logging off")

  replyContents = open(ltxname, 'r').read() # read entire file
  return replyContents

# in malloc?
def inMalloc():
  isInMalloc = -1;
  # as long as we don't find "Breakpoint" in report:
  while isInMalloc == -1:
    REP=logExecCapture("n")
#Look for calls that have '_malloc' in them 
    isInMalloc = REP.find("_malloc")
    if(isInMalloc != -1):
#       print ("Malloc:: ", isInMalloc, "\n", REP)
       gdb.execute("set $inMalloc=1")
       return True
    else:
#       print ("No Malloc:: ", isInMalloc, "\n", REP)
       gdb.execute("set $inMalloc=0")
       return False