繁体   English   中英

gcc -g调试标志是否会影响程序执行?

[英]Does the gcc -g debugging flag affect program execution?

我刚刚测试了一个我正在工作的程序,当我用-g编译它时,我发现它的执行速度提高了3μs(一个统计上显着的变化)。 这对我来说毫无意义 - 我认为-g标志不应该影响程序执行,即使它确实这样做也会使它运行得更慢,而不是更快。

谁能告诉我为什么会这样? 它是否改变了程序的执行流程? 我没有使用-O进行编译,因为我需要它完全按照写入执行,但是如果-g可以通过改变指令顺序以某种方式使它运行得更快我显然应该使用它。

所以我需要确切知道-g标志对程序的更改。

编辑:我运行的测试越多,t值越大(=差异变得越有统计意义)。 这绝对不是测量误差 - 事情正在发生。

正如其他人所说,调试符号不会改变代码的控制流,除非编译器中存在(不太可能的)错误。

但是,它改变了执行,因为可执行文件变得更大,并且执行的代码在更多页面上更广泛地传播。 您可以预期更多缓存未命中和IO信号。 在多任务环境(甚至Linux / busybox系统就是这样的事情)上,这可能导致稍微不同的调度行为。

另一方面,如你所描述的那样,测量这种微小的时间差异本身就是一种艺术。 您可能处于海森堡环境中,测量会影响执行时间。 您的测量结果可能会显示出统计上显着的偏差,但我会非常小心地将它们解释为这样且此类选项会使代码更快。

-g标志对实际生成的代码进行0更改。 它的作用是为可执行文件添加调试部分。 这些部分不会在运行时加载,但调试器可以加载它们。 由于可执行文件现在有点不同,它更大 - 你可能会尝试测量no。 在一个版本与另一个版本之间发生页面错误的情况下,可执行文件存储在磁盘上的方式会发生变化,但代码没有变化。

如果要查看程序集,请在二进制文件上运行objdump -d并进行比较

我确实质疑3us增加的有效性,可靠地测量3us,至少在通用操作系统上是一项艰巨的任务 - 我希望你运行你的程序几千次(可能是几十万次)来用这个数字来试图消除影响这种测量的所有随机事物。

当我在其中一个子程序上使用-debug和-g标志时,我的代码得到了不同的答案,所以虽然我不知道为什么,是的,它肯定会影响程序的执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM