我正在尝试为 LibreOffice 打印过程实现一些附加功能(一些特殊信息应自动添加到每个打印页面的页边距)。我将 RHEL 6.4 与 LibreOffice 4.0.4 和 Gnome 2.28 一起使用。

我的目的是研究 LibreOffice 和系统组件之间的数据流,并确定哪些源代码负责打印。之后我将不得不修改这些部分的代码。

现在我需要关于源代码研究方法的建议。我找到了很多工具,从我的角度来看:

  1. strace 看起来水平很低;
  2. gprof 需要使用“-pg”CFLAGS 重新编译二进制文件;不知道如何使用 LibreOffice 做到这一点;
  3. systemtap 只能探测系统调用,不是吗?
  4. callgrind + Gprof2Dot 在一起相当好,但表现出奇怪的结果(见下文);

例如,这是来自的调用图 callgrind 输出与 Gprof2Dot 可视化。我已开始 callgrind 用这样的命令:

valgrind --tool=callgrind --dump-instr=yes --simulate-cache=yes --collect-jumps=yes /usr/lib64/libreoffice/program/soffice --writer

并收到四个输出文件:

-rw-------.   1 root  root          0 Jan  9 21:04 callgrind.out.29808
-rw-------.   1 root  root     427196 Jan  9 21:04 callgrind.out.29809
-rw-------.   1 root  root     482134 Jan  9 21:04 callgrind.out.29811
-rw-------.   1 root  root     521713 Jan  9 21:04 callgrind.out.29812

最后一个 (pid 29812) 对应于正在运行的 LibreOffice Writer GUI 应用程序(我通过以下方式确定它) straceps aux)。我按了 控制键+ 和确定按钮。然后我关闭了应用程序,希望看到负责在日志中打印进程初始化的函数。

callgrind 输出经过处理 Gprof2Dot 根据这个答案的工具。不幸的是,我在图片上既看不到我感兴趣的操作,也看不到调用图。

如果您提供有关解决此类问题的正确方法的任何信息,我将不胜感激。谢谢。

enter image description here

有帮助吗?

解决方案

解决这个问题的正确方法是记住 LibreOffice 是开源的。整个源代码都有文档记录,您可以浏览文档: docs.libreoffice.org. 。不要采取困难的方式:)

此外,请记住,打印机设置对话框不是 LibreOffice 特定的,而是由操作系统提供的。

其他提示

您想要的是一个识别感兴趣的源代码的工具。测试覆盖率 (TC) 工具可以提供此信息。

TC 工具的作用是在程序运行时确定运行了哪些代码片段;将其视为一组代码区域的集合。通常TC工具与(交互式/单元/集成/系统)测试结合使用,以确定测试的有效性。如果只执行了少量代码(由 TC 工具检测到),则测试被解释为无效或不完整;如果覆盖了很大一部分,则说明拥有良好的测试以及运输产品的合理理由(假设所有测试均通过)。

但是你可以使用TC工具来查找实现功能的代码。首先,您执行一些测试(或者可能手动驱动软件)来练习感兴趣的功能,并收集 TC 数据。如果使用该功能,这会告诉您所执行的所有代码的集合;这是对您感兴趣的代码的高估。然后,您练习该程序,要求它执行一些类似的活动,但这并不练习该功能。这标识了绝对没有实现该功能的代码集。计算执行有功能的代码和...-无功能的代码的集合差异,以确定更专注于支持该功能的代码。

通过运行更多的练习功能和更多的不练习功能并计算这些集合的并集的差异,您自然可以得到更严格的界限。

有用于 C++ 的 TC 工具,例如“gcov”。我认为,它们中的大多数不会让/帮助您计算结果的此类差异;许多 TC 工具似乎不支持操作覆盖集。(我的公司制作了一系列具有此功能的 TC 工具,包括计算覆盖率集差异,包括 C++)。

如果你真的想 提炼 相关代码,TC工具不这样做。它们只是通过在源文件中指定文本区域来告诉您什么代码。大多数测试覆盖率工具仅报告覆盖范围 线 这样的文本区域;部分原因是许多测试覆盖工具使用的机制仅限于编译器记录的行号。

但是,可以拥有测试覆盖工具,该工具可以精确地报告从文件/行/列开始到文件/行/列结束的文本区域(咳咳,我公司的工具恰好可以做到这一点)。有了这些信息,就可以相当简单地构建一个简单的程序来读取源文件,并逐字提取所执行的代码。(这并不意味着提取的代码是格式良好的程序!例如,数据声明不会包含在执行的片段中,尽管它们是必要的)。

OP 没有说明他打算如何处理这些代码,因此片段集可能就是所需要的。如果他想提取代码和必要的声明,他将需要更复杂的工具来确定所需的声明。具有完整源代码解析器和名称解析器的程序转换工具可以为此提供必要的功能。这比仅使用临时提取文本提取的测试覆盖工具使用起来要复杂得多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top