gpt4 book ai didi

c++ - 我程序的标准输出的 setbase(16) 在哪里被调用?

转载 作者:行者123 更新时间:2023-11-30 01:59:24 24 4
gpt4 key购买 nike

我正在处理一个比较大的项目,我发现有人添加了一些与此类似的代码:

std::cout << std::hex << variable << endl;

除了搜索所有 cout 调用并手动查看每个 cout 调用之外,是否有一种方法可以确定哪个有问题的 cout 行将输出流的基数留为十六进制?

似乎有许多不同的方法来设置基数,因此在单个函数调用上设置断点似乎不起作用。例如:

  • ... << std::hex << ...
  • ... << setbase(16) << ...
  • std::cout.setf ( std::ios::hex, std::ios::basefield );
  • 等等

有什么快速的方法可以告诉我 libstdc++ 内部使用什么变量来存储基本变量,以便我可以在上面设置数据断点?

更新:

在研究代码之后,我终于能够使用部分来自 perreal 和 Employed Russian 的答案来提出解决方案。这是我所做的:

首先,我在我的程序中添加了以下代码,这样我就可以中断并进入函数以获取 cout 标志变量 (_M_flags) 的地址。

std::ios_base::fmtflags f;
f = std::cout.flags();

我在第二行打了个断点,进入函数,得到如下libstdc++代码:

// [27.4.2.2] fmtflags state functions
/**
* @brief Access to format flags.
* @return The format control flags for both input and output
*/
fmtflags
flags() const
{ return _M_flags; }

不幸的是,gdb 无法打印出这个变量,但通过反汇编 View ,我能够查明 _M_flags 使用的地址:

 x0x84ca2e8 <std::ios_base::flags() const>                push   %ebp
x0x84ca2e9 <std::ios_base::flags() const+1> mov %esp,%ebp
x0x84ca2eb <std::ios_base::flags() const+3> mov 0x8(%ebp),%eax
>x0x84ca2ee <std::ios_base::flags() const+6> mov 0xc(%eax),%eax
x0x84ca2f1 <std::ios_base::flags() const+9> pop %ebp
x0x84ca2f2 <std::ios_base::flags() const+10> ret

0xc(%eax)包含 _M_flags 的地址。

在我获得地址后,在其上设置一个条件硬件观察点以查看十六进制位何时更改并追踪有问题的代码是相当简单的。

事实证明,在运行时通过 dlopen 加载的 .so 对象是罪魁祸首。

我最终使用了此 question 引用的 Boost IO State Savers解决问题。

最佳答案

Is there any quick way i can tell what variable internally glibc is using to store the base variable so i can set a data breakpoint on it?

否:glibc 是一个 C图书馆,对std::cout一无所知,这是一个 C++构造。你的问题是关于 libstdc++ ,与 glibc 无关。

查看 libstdc++ implementation , 您似乎想要在 std::cout._M_os._M_flags 上设置观察点.但是,由于标志中的各个位在输出操作期间被多次设置,您可能希望使观察点以 _S_hex (== 1<<3 == 8) 为条件。位。

关于c++ - 我程序的标准输出的 setbase(16) 在哪里被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16328181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com