某项目中使用Visual Studio开发了界面和逻辑,而底层代码由于是以linux为主的项目,所以使用mingw64编译为dll。
测试时有种情况经常会导致崩溃,远程调试起来也比较繁琐,dll部分需要使用GDBServer+VSCode远程调试,界面逻辑可以使用Visual Studio + VS中的Remote Debugger远程调试。
调试中发现进入dll内部的一个函数时在函数的第一行就崩溃了,断点断在函数的花括号那里,当时查看函数前后逻辑应该都是正常的,变量和寄存器的值也都是正常的。同样流程的代码在使用mingw64编译的一个测试程序中正常使用。
于是编译exe和dll的Debug版本再使用vscode远程调试,然后在进入函数之前切换为汇编代码,发现程序崩溃在call 0x7ffba35d1970 <___chkstk_ms>
中,再一搜索跟堆栈有关。
使用PE工具查看 DLL 的PE头中 默认栈大小为2MB,而exe的PE头中显示默认栈大小为1MB。回头看那代码,第一行就是 char buffer[1024*1024];
。
所以问题解决办法,二选一:
- DLL代码中使用堆内存。
- Exe编译选项中默认栈大小改为与Mingw统一的2MB。