【问题标题】:debugger gdb evaluate expression调试器 gdb 评估表达式
【发布时间】:2016-08-21 21:37:57
【问题描述】:

有评估功能吗?我已经阅读了“帮助”,但没有找到

我想做eval("gdb command")

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

How to grep on gdb print.

我想做eval($arg1)

【问题讨论】:

    标签: gdb


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      奇怪的是,我今天早些时候为另一个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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-05
        • 2015-12-11
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多