我刚刚读到 GCC 函数属性artificial
但不太明白描述。你能给我一些有用的例子吗?
另一个答案没有错,但也许我可以解释得更好一些。
想象一下这个函数foo.c
,带有行号:
10: static inline int foo(struct q *x)
11: {
12: return bar(x + 1);
13: }
这从另一个函数调用两次:
20: void baz(void)
21: {
22: x = foo(qa);
23: x = foo(qb);
24: }
很遗憾,bar()
崩溃。这是回溯:
#0 0x00000000004b1a2a in bar (x=0x8) at foo.c:5
#1 0x0000000000416ee0 in baz () at foo.c:12
#2 0x0000000000413fab in main () at foo.c:30
Since foo
是内联的,它不是回溯的一部分,但是等等,foo.c:12
is in foo
,下面只是一行main
。没有什么可以告诉我们哪一行baz
导致了坠机事故。
如果我们将 foo 标记为人工的,我们会得到以下回溯:
#0 0x00000000004b1a2a in bar (x=0x8) at foo.c:5
#1 0x0000000000416ee0 in baz () at foo.c:22
#2 0x0000000000413fab in main () at foo.c:30
它不再指向foo
。相反,它向我们展示了在哪里foo
被叫自foo.c:22
。突然间很容易说出这一点qa
是有问题的变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)