相关疑难解决方法(0)

在调用函数时使GDB打印控制流程

如何调用感兴趣的gdb打印函数,根据堆栈的深度缩进?

我希望能够说出(制作):

(gdb) trace Foo* Bar* printf
Run Code Online (Sandbox Code Playgroud)

并让gdb打印所有以Foo或Bar开头的函数,因为它们被调用.有点像gnu cflow,除了使用调试符号和仅实际调用的打印函数,而不是所有可能的调用流.

无法帮助的工具包括cachegrind,callgrind和oprofile,它们最常调用函数的结果.我需要保留的调用顺序.

通配符(或等效的)是必不可少的,因为有很多Foo和Bar函数.虽然我愿意完全记录所有功能.或者,也许告诉gdb记录特定库中的所有函数.

某些GDB向导必须有一个用于此常见作业的脚本!

c debugging gdb dynamic call-graph

17
推荐指数
3
解决办法
2万
查看次数

如何在GDB中自动打印下N行?

我一直试图找到一种方法来自动化GDB中跟踪程序控制流程的进度.

即使只是一种自动执行n命令的简单方法,您也可以查看调用例程的顺序.

我意识到你可以发出n xx是GDB逐步执行的次数的问题,但问题在于它显示的是命令而不是例程的地址!但是如果你n在GDB中手动按下(然后按回车键发出上一个命令),它会显示地址.

我在GDB中尝试了以下内容:

(after setting a breakpoint at say 0x0123456)
b *0x0123456
Run Code Online (Sandbox Code Playgroud)

GDB说<breakpoint 1 at 0x123456>.我键入:

commands 1
n 1000
c
end
Run Code Online (Sandbox Code Playgroud)

但它没有按预期循环,也没有显示地址位置:-(.

任何帮助,将不胜感激!当然必须简单的自动登录命令例程被调用??

trace gdb dynamic call-graph control-flow

16
推荐指数
4
解决办法
2万
查看次数

跟踪和记录 C++ 程序的逐行执行

我正在开发一个开源有限元软件,它是用 C++ (Visual Studio) 编写的。提供的文档和示例仅有助于了解为了特定目的而调用哪些方法,但无法帮助用户了解这些方法到底在做什么。对于某些方法,除了 C++ 代码之外,没有其他可用的参考(例如书籍、研究论文等)

因此,为了推导出这个概念,我尝试使用断点和查看调用堆栈(Visual Studio 中提供的选项)来跟踪每一行执行,这可能适合跟踪小程序,但我的程序由许多具有多个继承的类组成和多态函数。为了理解程序执行流程,我想在日志文件中打印程序执行的每一行。

在研究过程中,我发现了一些有用的信息(此处),采用 python 语言。这正是我所需要的。为了方便读者,我复制了下面视频中提到的代码

import sys

def remove_html_markup(s):
    tag     =   False
    quote   =   False
    out     =   " "

    for c in s:
        if c == 'c' and not quote:
            tag = True
        elif c== '>' and not quote:
            tage = False
        elif c == '"' or c == "'" and tag:
            quote = not quote
        elif not tag:
            out = out + c
    return out

def traceit(frame, event, arg): …
Run Code Online (Sandbox Code Playgroud)

c++ python logging trace visual-studio

5
推荐指数
1
解决办法
1379
查看次数

标签 统计

call-graph ×2

dynamic ×2

gdb ×2

trace ×2

c ×1

c++ ×1

control-flow ×1

debugging ×1

logging ×1

python ×1

visual-studio ×1