【问题标题】:Tracing and logging line by line execution of a c++ program逐行跟踪和记录 c++ 程序的执行
【发布时间】:2019-11-26 12:33:02
【问题描述】:

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

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

在研究过程中,我发现了一些有用的信息 (here),用的是 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):
    if event == "line":
        filename    =   frame.f_code.co_filename
        lineno      =   frame.f_lineno
        print open(filename).readlines()[lineno - 1]

    return traceit

sys.settrace(traceit)
s = remove_html_markup('"<')
sys.settrace(none)

我期待一个类似版本的用于 traceit 函数的 C++ 代码,它可以在单独的日志文件中打印正在执行的每一行。我不知道如何扩展它,以便它可以打印所有继承和多态函数。

我还看到并尝试了在 StackOverflow for c++ 上的 answer 之一中提供的方法。但是,它有两个缺点

  1. 它只打印文件名、函数名和行号。我还想打印正在执行的语句。
  2. 在函数的开头,我必须调用一个方法CALLSTACK_DUMP();,由于函数过多,我无法在我的程序中执行此操作。

【问题讨论】:

    标签: python c++ visual-studio logging trace


    【解决方案1】:

    Python 是逐行解释的。解释型语言通常具有某种跟踪触发器,因此在解释每行执行时,它还会跟踪这些行。 C++ 是一种完全编译的语言,因此没有这样的跟踪工具。

    【讨论】:

    • 非常感谢您的回答。如果没有跟踪工具,有没有办法在visual c++中记录调用堆栈
    • @The_Learner 这是从解释语言到完全编译语言的范式转变。将打印/日志消息注入代码中的关键位置以帮助您进行调试。还要了解如何使用调试器 - 有一个步骤工具可以在源代码执行时遍历它。
    猜你喜欢
    • 1970-01-01
    • 2018-09-17
    • 2020-12-14
    • 2013-05-15
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多