逐行跟踪和记录 C++ 程序的执行情况
Tracing and logging line by line execution of a c++ program
我正在开发一个用 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++ 代码,它可以在单独的日志文件中打印正在执行的每一行。我不知道如何扩展它,以便它可以打印所有继承和多态函数。
我还看到并尝试了 Whosebug 上 answer 中为 c++ 提供的一种方法。但是,它有两个缺点
- 它只打印文件名、函数名和行号。我还想打印正在执行的语句。
- 在函数的开头我必须调用一个方法
CALLSTACK_DUMP();
,我不能在我的程序中这样做,因为有太多的函数。
Python 被解释为 line-by-line。解释型语言通常有某种跟踪触发器,因此在解释每一行执行时,它还会跟踪这些行。 C++ 是一种完全编译的语言,因此没有这种跟踪功能。
我正在开发一个用 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++ 代码,它可以在单独的日志文件中打印正在执行的每一行。我不知道如何扩展它,以便它可以打印所有继承和多态函数。
我还看到并尝试了 Whosebug 上 answer 中为 c++ 提供的一种方法。但是,它有两个缺点
- 它只打印文件名、函数名和行号。我还想打印正在执行的语句。
- 在函数的开头我必须调用一个方法
CALLSTACK_DUMP();
,我不能在我的程序中这样做,因为有太多的函数。
Python 被解释为 line-by-line。解释型语言通常有某种跟踪触发器,因此在解释每一行执行时,它还会跟踪这些行。 C++ 是一种完全编译的语言,因此没有这种跟踪功能。