【问题标题】:App crash after modifying a structure [closed]修改结构后应用程序崩溃[关闭]
【发布时间】:2016-08-09 14:54:31
【问题描述】:

我遇到了一个编译好的项目,但在启动时甚至在到达 InitInstance() 之前就崩溃了。 这发生在我将字符串添加到结构之后:

typedef struct
{
long            nChannelIndex;
TCHAR           szChannelName[32];
DWORD           dwStartTime;        // time_t
DWORD           dwPlaytimeMs;       // msecs
TCHAR           szStepName[32];
TCHAR           szFilename[MAX_PATH];
long            nLenMs;
TCHAR           szStepDescr[64];
DWORD           dwSessionID;
TCHAR           szLocationName[32];
long            bInsertion;
BOOL            nOrigin;        // 0= local,  1= cuemaster,
TCHAR           szList[32];
TCHAR           szFSPath[MAX_PATH];  <<  THIS HERE IS THE PROBLEM
}REPORTDATA, *LPREPORTDATA;

当我添加结构的最后一个成员时,问题就开始了。如果我将数组大小减小到较小的数字(比如 12),则应用程序可以正常工作。

我在 chkstk.asm 中遇到了崩溃 - 围绕此代码:

; Find next lower page and probe
cs20:
sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
test    dword ptr [eax],eax     ; probe page.
jmp     short cs10

我正在 Windows 7 Ultimate 64 位上编译一个 32 位 c++ 应用程序。微软 2010 年。

我不是要求调试我的代码。只需包含代码以显示引发崩溃的原因以及发生的位置。

有什么想法吗? 感谢您的帮助!

【问题讨论】:

  • 你有这些结构的大数组作为局部变量吗?
  • 无法从发布的代码中诊断。请张贴SSCCE。至少非常,使用/访问这个怪物发布代码。
  • 不可能发布 SSCCE,因为这个应用程序是一个怪物——正如你所说。它是一个多线程数字视频服务器,能够处理多达 128 个频道的广告插入。而且,正如我之前所说,无法访问这些数据,应用程序一启动就会崩溃。 @MarkRansom 可能是对的。

标签: c++ windows visual-studio-2010


【解决方案1】:

发生崩溃的模块的名称chkstk.asm 是正在发生的事情的线索。它正在检查堆栈分配以确保您没有用完。通过向您的结构中添加一个大的新元素,您似乎已经用完了。单个结构很难用完堆栈空间,所以我假设你有一个数组。局部变量是分配给堆栈的,所以问题很可能是包含这些结构的数组的局部变量。

您可以使用/F compiler switch 为您的程序提供更多堆栈空间。

您也可以使用vector 代替数组,这将在堆而不是堆栈中分配空间。

【讨论】:

    【解决方案2】:

    虽然确实无法根据您提供的信息进行正确诊断,但可以相当安全地假设您已溢出堆栈。正如 Mark Ransom 所说,您可能在堆栈的某个地方有大量的本地数组。

    编辑: 堆栈(通常但不一定存储局部变量)在应用程序内部是有限大小的,通常在创建线程时分配,并且可以使用 pthread_attr_setstacksize 等 OS 函数进行配置,如果堆栈空间不足,这是一种选择是扩大您正在处理的线程上的堆栈,尽管这通常不是一个好主意。

    该问题最简单和最安全的解决方案是通过调用 C malloc 或 C++ new 来分配堆上的大数据。堆通常比堆栈大许多数量级,但在处理完数据后需要显式 C 释放或 C++ 删除,它不会像堆栈变量一样在本地范围结束后被清除。

    请注意,堆变量的主要问题是它们会泄漏,例如,通过抛出提前退出的函数。这就是为什么建议在处理堆对象时使用 std::unique_ptr 来存储它,这符合RAII 的概念。

    【讨论】:

    • 该应用程序可能有 24、48、96 或 128 个,具体取决于客户购买的许可证,所以是的。我该怎么办?
    • 我会扩展我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多