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