2016-08-21 3 views

ответ

1

Существует eval команда, но это на самом деле не делать то, что вы хотите. Он предоставляет ограниченную форму подстановки значений в команды.

Для команды по строкам grep я бы предложил написать ее в Python. Это было бы относительно легко сделать. Идея состояла бы в том, чтобы использовать gdb.execute для захвата вывода команды в строку, а затем использовать Python для поиска строки, как вам нравится. Если вы закончили с Python, у вас есть полный контроль над анализом командной строки, то это неверно, если вы используете команду gdb define.

1

Как ни странно, ранее я написал функцию gpb python grep для другого question. Эти два файла создают новую команду, которая проверяет, содержит ли стек вызовов _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 

Вот файл питон:

#!/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 
Смежные вопросы