修改结构后应用程序崩溃
App crash after modifying a structure
我遇到了一个项目,该项目编译正常但在启动时甚至在到达 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++ 应用程序。 Msvc 2010.
我不是要求调试我的代码。仅包含代码以显示是什么触发了崩溃以及崩溃发生的位置。
有什么想法吗?
感谢您的帮助!
虽然确实无法根据您提供的信息进行正确诊断,但可以相当安全地假设您已经溢出堆栈。正如 Mark Ransom 所说,您可能在堆栈的某个地方有大量的本地阵列。
编辑:
通常(但不一定)存储局部变量的堆栈在您的应用程序中是有限大小的,它通常在创建线程时分配,并且可以使用 OS 函数配置,例如 pthread_attr_setstacksize,一个选项如果你 运行 out of stack space 是扩大你正在处理的线程上的堆栈,虽然这通常不是一个好主意。
解决该问题的最简单和最安全的方法是通过调用 C malloc 或 C++ new 在堆上分配大数据。堆通常比堆栈大很多数量级,但是当您完成数据处理时需要显式的 C free 或 C++ delete,它不会像堆栈变量那样在局部作用域结束后被清除。
请注意,堆变量的主要问题是它们会泄漏,例如,通过 throw 提前退出的函数。这就是为什么建议在处理堆对象时使用std::unique_ptr来存储它,这符合RAII概念。
发生崩溃的模块的名称chkstk.asm
是正在发生的事情的线索。它正在检查堆栈分配以确保您没有 运行。通过向您的结构添加一个大的新元素,您似乎 运行 出来了。使用单个结构很难 运行 出栈 space ,所以我假设你有一个数组。局部变量是分配给堆栈的内容,因此问题很可能是包含这些结构数组的局部变量。
您可以使用 /F
compiler switch 为您的程序提供更多堆栈 space。
您也可以使用 vector
而不是数组,这将在堆中而不是堆栈中分配 space。
我遇到了一个项目,该项目编译正常但在启动时甚至在到达 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++ 应用程序。 Msvc 2010.
我不是要求调试我的代码。仅包含代码以显示是什么触发了崩溃以及崩溃发生的位置。
有什么想法吗? 感谢您的帮助!
虽然确实无法根据您提供的信息进行正确诊断,但可以相当安全地假设您已经溢出堆栈。正如 Mark Ransom 所说,您可能在堆栈的某个地方有大量的本地阵列。
编辑: 通常(但不一定)存储局部变量的堆栈在您的应用程序中是有限大小的,它通常在创建线程时分配,并且可以使用 OS 函数配置,例如 pthread_attr_setstacksize,一个选项如果你 运行 out of stack space 是扩大你正在处理的线程上的堆栈,虽然这通常不是一个好主意。
解决该问题的最简单和最安全的方法是通过调用 C malloc 或 C++ new 在堆上分配大数据。堆通常比堆栈大很多数量级,但是当您完成数据处理时需要显式的 C free 或 C++ delete,它不会像堆栈变量那样在局部作用域结束后被清除。
请注意,堆变量的主要问题是它们会泄漏,例如,通过 throw 提前退出的函数。这就是为什么建议在处理堆对象时使用std::unique_ptr来存储它,这符合RAII概念。
发生崩溃的模块的名称chkstk.asm
是正在发生的事情的线索。它正在检查堆栈分配以确保您没有 运行。通过向您的结构添加一个大的新元素,您似乎 运行 出来了。使用单个结构很难 运行 出栈 space ,所以我假设你有一个数组。局部变量是分配给堆栈的内容,因此问题很可能是包含这些结构数组的局部变量。
您可以使用 /F
compiler switch 为您的程序提供更多堆栈 space。
您也可以使用 vector
而不是数组,这将在堆中而不是堆栈中分配 space。