在不修改源代码的情况下在 C 中显示文件名、行号和函数
display filename, line number and function in C without modifying the source code
我是新来的公司,使用几乎没有任何跟踪机制的C 源代码。
我想知道应用程序是否通过某个文件以及在哪里(哪个函数)。
我可以使用断点来执行此操作,但相关文件包含大量函数。
因此我正在寻找某种工具,我可以将其附加到应用程序,并提供以下类型的输出:
-- Main.c (main_function())
---- submain.c (submain_function())
...
据此,我可以推断出应用程序传递的位置(哪个文件名、哪个函数)。
有人知道这样的工具是否存在吗?
谢谢
如果你在 linux,gdb
可能会派上用场。
您可以使用 -g
或 -g3
选项和 gcc
编译代码,然后使用 gdb ./<executable_name>
运行 二进制文件,在所需位置设置断点在任何源文件中运行并检查调用。
单步执行应用程序时,它会显示执行指令的文件名和行号。
我假设你在 Linux 上开发。然后您还可以自定义 GCC compiler, in particular using MELT(一种用于扩展 GCC 的 lispy 域特定语言),让编译器在许多地方添加一些日志记录。为此,您需要插入一个新的 GCC "optimization" pass 来完成这样的工作,最重要的是,您需要了解有关 GCC 内部表示的一些细节(Gimple、Tree-s、Basic 块,.. .)
但是,这可能需要您花费一周以上的时间。除非你的代码库真的很大(至少有 50 万
行)可能不值得付出努力
我是新来的公司,使用几乎没有任何跟踪机制的C 源代码。 我想知道应用程序是否通过某个文件以及在哪里(哪个函数)。 我可以使用断点来执行此操作,但相关文件包含大量函数。
因此我正在寻找某种工具,我可以将其附加到应用程序,并提供以下类型的输出:
-- Main.c (main_function())
---- submain.c (submain_function())
...
据此,我可以推断出应用程序传递的位置(哪个文件名、哪个函数)。
有人知道这样的工具是否存在吗? 谢谢
如果你在 linux,gdb
可能会派上用场。
您可以使用 -g
或 -g3
选项和 gcc
编译代码,然后使用 gdb ./<executable_name>
运行 二进制文件,在所需位置设置断点在任何源文件中运行并检查调用。
单步执行应用程序时,它会显示执行指令的文件名和行号。
我假设你在 Linux 上开发。然后您还可以自定义 GCC compiler, in particular using MELT(一种用于扩展 GCC 的 lispy 域特定语言),让编译器在许多地方添加一些日志记录。为此,您需要插入一个新的 GCC "optimization" pass 来完成这样的工作,最重要的是,您需要了解有关 GCC 内部表示的一些细节(Gimple、Tree-s、Basic 块,.. .)
但是,这可能需要您花费一周以上的时间。除非你的代码库真的很大(至少有 50 万 行)可能不值得付出努力