对于 C++ 源代码打印&“一些字符串文字”时,GDB 返回什么?

问题描述 投票:0回答:1

在 GDB 中,我可以执行以下操作并获取字符串文字的地址:

(gdb) p &"aaa"
$3 = (char (*)[4]) 0x614c20

据我了解,字符串文字是一个没有符号绑定的右值,但为什么我可以获得它的addr?

是什么样的地址?所有字符串文字都存储在某个地方吗?但是字符串文字是无限的,这是否意味着字符串文字是按需“创建并放入内存”的?

c++ gdb
1个回答
0
投票

GDB 在调试对象内部调用

malloc
为字符串文字分配空间,然后将字符串文字写入新分配的内存块并返回它的地址。

它通过构建一个假堆栈框架来实现这一点,该堆栈框架调用 malloc() 并设置为返回断点指令。然后它默默地恢复程序,让对 malloc 的调用完成,然后当程序返回到断点时重新控制程序。

您可以通过在

malloc
本身设置断点,然后运行
print &"foo"
来证明这种情况正在发生。 GDB 将命中断点并显示以下消息:

The program being debugged stopped while in a function called from GDB.
Evaluation of the expression containing the function
(malloc) will be abandoned.
When the function is done executing, GDB will silently stop.

如果您好奇,可以检查第一个参数的值(x86-64 上的 $rdi)并验证它是否等于 4(字符串文字的长度 + 1)。您还可以检查堆栈跟踪以查看假断点返回地址。

这种行为可能会令人惊讶;毕竟,人们通常不会期望

print &"foo"
在调试对象中执行代码。如果您想禁用此行为,请运行
set may-call-functions off

© www.soinside.com 2019 - 2024. All rights reserved.