C++ 我的程序在哪里;s标准件';什么是挫折(16)?

C++ 我的程序在哪里;s标准件';什么是挫折(16)?,c++,gdb,cout,C++,Gdb,Cout,我正在做一个比较大的项目,我发现有人添加了一些类似的代码: std::cout << std::hex << variable << endl; 我在第二行设置了一个断点,并进入函数,得到了以下libstdc++代码: // [27.4.2.2] fmtflags state functions /** * @brief Access to format flags. * @return The format control flags for

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

std::cout << std::hex << variable << endl;
我在第二行设置了一个断点,并进入函数,得到了以下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无法打印出这个变量,但通过转到反汇编视图,我能够精确地找到_M_标志使用的地址:

 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
x0x84ca2e8推送%ebp
x0x84ca2e9移动百分比esp,%ebp
x0x84ca2eb mov 0x8(%ebp),%eax
>x0x84ca2ee mov 0xc(%eax),%eax
x0x84ca2f1弹出%ebp
x0x84ca2f2 ret
0xc(%eax)
包含_M_标志的地址

std::ios_base::fmtflags f;
f = std::cout.flags();
在我得到地址后,在地址上设置一个条件硬件观察点,以查看十六进制位何时更改并跟踪违规代码是相当简单的

原来是一个.所以在运行时通过dlopen加载的对象是罪魁祸首

我最终使用了本文引用的Boost IO状态保存器来解决这个问题

#include <iostream>
int main() {
    std::ios_base::fmtflags f;
    f = std::cout.flags();
    std::cout << 21 << std::endl;
    std::cout << (f & std::cout.hex) << std::endl;
    std::cout << std::hex << 21 << std::endl;
    f = std::cout.flags();
    std::cout << (f & std::cout.hex) << std::endl;
    return 0;
}
因此,您似乎可以使用
f&std::cout.hex
作为表达式,或者找出该标志在
std::cout
中的存储位置,这可能取决于实现

因此,您似乎可以使用
f&std::cout.hex
作为表达式,或者找出该标志在
std::cout
中的存储位置,这可能取决于实现

有没有什么快速的方法可以告诉我glibc内部使用什么变量来存储基变量,这样我就可以在它上面设置一个数据断点

否:glibc是一个
C
库,对
std::cout
一无所知,这是一个
C++
结构。您的问题是关于
libstdc++
,而不是关于glibc

查看libstdc++,似乎您需要在
std::cout.\u M_os.\u M_flags
上设置一个观察点。但是,由于在输出操作期间多次设置标志中的各种位,因此您可能希望使监视点以
\u S\u hex(=1)为条件
有没有什么快速的方法可以告诉我glibc内部使用什么变量来存储基变量,这样我就可以在它上面设置一个数据断点

否:glibc是一个
C
库,对
std::cout
一无所知,这是一个
C++
构造。你的问题是关于
libstdc++
,而不是关于glibc


查看libstdc++,您似乎希望在
std::cout.\u M_os.\u M_flags
上设置一个观察点。但是,由于在输出操作期间多次设置了标志中的各种位,因此您可能希望使观察点以
\u S_十六进制为条件(==1感谢您提供的信息。我已将问题改为指libstdc++而不是glibc。我将在今天晚些时候有空时尝试设置观察点,并让您知道结果。感谢您提供的信息。我已将问题改为指libstdc++而不是glibc。我将在今天晚些时候有空时尝试设置观察点腾出一分钟,让你知道结果如何。
21
0
15
8