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

时间:2019-07-17 15:49:36

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

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

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

在进行研究时,我发现了一些有用的Python语言信息(here)。这正是我所需要的。为了方便读者,我正在复制下面视频中提到的代码

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上answer中为c ++提供的一种方法。但是,它有两个缺点

  1. 仅打印文件名,带有行号的函数名。我还想打印正在执行的语句。
  2. 在函数的开头,我必须调用方法CALLSTACK_DUMP();,由于有很多函数,我无法在程序中执行该方法。

1 个答案:

答案 0 :(得分:2)

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