- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个小型 VC++ 应用程序,分成两部分。第一部分包含主要功能并被编译为静态库。第二部分是从第一部分链接到库的 Windows 服务。
我看到一些由内存损坏引起的奇怪行为。通过设置数据断点等,每次将库对象之一的某些成员写入两个时,我能够确定服务 block 中的静态变量被破坏。相反,当静态变量指向的位置被写入时,库对象的成员被破坏。会不会有对象重叠?
编辑:我忘了在我的服务代码中提到 BlahHelper 的实例在全局范围内。这支持重叠理论,因为 BlahHelper 和 ServiceBase::m_service 应该都在 exe 的全局数据区域中。
EDIT2:通过查看原始内存并检查所有相关对象的地址,我确认 BlahHelper 对象与 ServiceBase::m_service 指针重叠。为什么会这样?
下面是感兴趣的类定义:
// This is the basis of my service. I derive from this and override
// the start() and stop() methods to implement the service.
class ServiceBase
{
public:
virtual ~ServiceBase();
static void Run(ServiceBase& service);
protected:
ServiceBase(DWORD controlsAccepted = SERVICE_ACCEPT_PAUSE_CONTINUE |
SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN);
virtual void Start(DWORD control) = 0;
virtual void Stop(DWORD control) = 0;
void UpdateState(DWORD state,
HRESULT errorCode = S_OK);
const std::wstring& ServiceName() const;
private:
void SetServiceStatus();
static void WINAPI ServiceMain(DWORD argumentCount,
PWSTR* arguments);
static void WINAPI Handler(DWORD control);
static ServiceBase* m_service; // This is being corrupted
SERVICE_STATUS_HANDLE m_handle;
ServiceStatus m_status;
std::wstring m_serviceName;
};
这是库中的一个类。当我将库链接到我的服务 exe 并实例化一个 BlahHelper 对象时,我看到一些奇怪的内存损坏问题。
// Writing to _blah2Open or _blah1Open causes corruption of ServiceBase::m_status
class BlahHelper
{
// Names changed to protect the innocent
public:
BlahHelper();
~BlahHelper();
HRESULT GetSomeInfo();
HRESULT GetSomeStatus(LPWORD statPosition);
void Init(char blah1Sp[], char blah2Sp[], HWND messageWindow);
bool Blah1ConnectionOpen(){return _blah2Open;};
bool Blah2ConnectionOpen(){return _blah1Open;};
hash_map<string,short> GetSomeJunk(){return _someJunk;};
void Refreshblah1Config();
bool HasItemsTakenSensor(){return _blah1HasItemsTakenSensor;};
void Enterblah2();
void blah2Exited();
void Ackblah2ExitReq();
void Cleanup();
void Initblah1();
void Initblah2();
private:
LPWFSRESULT OpenSession(char* spName, HSERVICE* handle);
LPWFSRESULT Getblah1Caps();
void Cleanupblah1();
void Cleanupblah2();
void Closeblah1();
void Closeblah2();
void Openblah1();
void Openblah2();
void Registerblah1();
void Registerblah2();
void Checkblah1Caps();
void CheckSomeJunk();
void Getblah1Config();
void LogMessage(string message, int logLevel);
char* _SpName1;
char* _SpName2;
HWND _messageWindow;
HSERVICE _Handle1;
HSERVICE _Handle2;
bool _blah2Open; // writing to this causes corruption of ServiceBase::m_service
bool _blah1Open; // writing to this causes corruption of ServiceBase::m_service
const string _logSource;
const int _logMsgId;
bool _blah1HasItemsTakenSensor;
hash_map<string, short> _someJunk;
};
正如我所说,数据断点显示写入 _blah1Open 或 _blah2Open 会损坏 ServiceBase::m_service。作为进一步确认,我注释掉了写入这些值的 BlahHelper 实现的每一行,并且损坏消失了。
如果我更改 BlahHelper 成员的声明顺序,我仍然会看到内存损坏问题,但症状会发生变化。
如果我直接在服务中包含库代码,我就不会再看到这个问题了。除了诊断目的,我不能这样做,但它确实表明链接过程中发生了一些奇怪的事情。
另一件需要注意的事情是,该库是使用 Muli-Byte 字符集编译的,而链接该库的服务应用程序是使用 Unicode 编译的。这将很难改变。
谁能提出发生这种情况的可能原因,或诊断问题的方法?当我意识到我有内存损坏时,我希望有一个简单的原因(比如缓冲区溢出)。但是,我不知道为什么一个物体会像这样踩到另一个物体。
最佳答案
你是说m_service本身变了还是*m_service变了?
如果您检查 &_blah2Open 和 m_service 地址匹配吗?
(记住_blah2Open是一个变量,m_service是一个指针,所以你需要_blah2Open的地址和m_service的值)
_blah2Open 的地址必然位于堆或栈上,作为 CBlahHelper 的一部分进行分配,因此该地址不太可能指向 m_service 的内容。
如果是m_service指向的内容改变的情况,一种可能的情况是:m_service 在代码中的某处进行了初始化,但由于某种原因在您的情况下未调用静态初始化程序,因此 m_service 随机指向某处并且当某些对象分配到那里时内容被覆盖。您需要在程序运行的最开始放置一个数据断点,并跟踪每次 m_service 何时更改。
另一方面,如果您说 m_service 和 _blah1Open 在故障点具有相同的地址:两个不同的变量(不在一个 union 中)总是有不同的地址,所以 m_service 和 _blah2Open 在内存中共享同一个地址是不合乎逻辑的。这意味着编译器生成的代码出现根本性故障的可能性极小......
关于c++ - 来自无关库对象的静态变量损坏(反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2722008/
假设我们要描述一个满足以下真值表的组合电路: a b | s0 s1 s2 s3 ----------------- 0 0 | 1 d d d 0 1 | 0 1 d d 1 0 |
.mainIDv { height:300px; width:400px; padding:5px; margin: 8px auto 8px auto; } .ImgDisp{
我的 iOS 应用程序遇到了一个恼人的问题。突然,当我启动带有 TableView 的 View Controller 时,出现以下错误: Unrecognized selector sent to
我有一个简单的 PreferenceActivity 类,它的 onCreate 将我的 R.xml.preferences 屏幕传递给 ((PreferenceActivity)super).add
在大学项目范围内,我应该实现数据库的聚合。 我得到了一个实体关系模型,它看起来与此类似: 现在我应该实现一个 SQL 脚本来创建这样的数据库,但我在谷歌或其他任何地方找不到有关此主题的任何内容。在我教
我一直在努力阅读 GCD 并试图弄明白。我读了很多地方,应该始终使用 GCD,如果一个人正在做一些繁重的工作,这会卡住 UI,我确实理解这一点,但是 GCD 也可以仅仅为了性能而使用吗?假设我有一个循
当有人用他们自己的类重载线程时,这个问题似乎已经以一种或另一种形式得到了回答,但是如果只是尝试使用 QTimer 类而不扩展 QThread 类呢?我正在尝试将 QTimer 用于 QT。他们在 上的
在网上看了类似的问题/错误,没有一个对我有帮助... 未处理的拒绝 SequelizeEagerLoadingError:任务未关联到用户! 我的用户路线 router.get('', functio
如果我正在评估两个变量而不是两个方法调用,那么我使用“&&”或“&”是否重要 //some logic that sets bool values boolean X = true; boolean
我们目前正在内部为我们的项目使用 Oracle 10g,这不太可能改变,但最终我们将向其他客户提供此应用程序,我们需要能够提出替代的免费数据库。 那么使 Hibernate 持久层独立于所使用的底层
我的 AsyncTask 类中的 onPostExecute() 方法有问题。 我有一个SignupActivity: public class SignupActivity extends AppC
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我一直在大量关注 sequelize 的文档,但在处理关系时遇到了问题。这是我使用 belongsTo 创建两个非常基本的 1:1 关系的非常简单的代码 import Sequelize, { STR
我希望这与 GMT 无关,否则我会觉得自己很愚蠢。 2 个快速相关的问题。为什么这会转换为不同的日期?正在失去一天。我查看了其他答案中所述的时区,但它始终是 GMT 时区 0000,这正是我所期望的。
我发现了这个问题的很多版本,但似乎都没有比明显的 Google Chrome 错误更进一步。 发生的情况是,每当我将 codeigniter 设置复制到服务器上的新文件夹,以基于它启动新项目时,我在尝
我需要一个与 UI 无关的简单布局管理器。通过这个,我的意思是它不应该指定我想如何在屏幕上表示我的形状/控件。它应该能让我说: 我想要 X 形状。我想要 X 形下的 Y 形。我希望形状 Z 包围 X,
当有一个方法== , 方法 !=被定义为采用该结果并应用 !给它。 (可能还有 =~ 和 !~ 。) 与此不同,>= , 通常表示 >或 == , 实际上独立于 >和 == .这两个定义似乎都不会影响
我在 Ruby Netbeans 6.5.1 中获得了大量(我称之为)无关的自动完成信息。 例如,如果我输入一个模型对象的名称,然后输入一个句点(无论我是在 Controller 中还是在 View
我是 NodeJS 的新手,有 express 和 Sequelize。当我想创建图书租赁时,控制台会提示我“图书与租赁无关”。 当我将表迁移到 sql 数据库时,id 就在它们的位置并且我的播种机正
我有众所周知的错误: implicit declaration of function 'STLINKReadSytemCalls' [-Wimplicit-function-declaration]
我是一名优秀的程序员,十分优秀!