文章目录
- 一、前言
- 二、具体操作
- 1、C++代码
- 2、编译C++代码,生成cppDll.dll
- 3、将cppDll.dll拷贝到Unity工程中
- 4、Unity C#代码
- 5、Unity打包exe
- 三、测试
一、前言
最近在搞Unity在Windows平台的崩溃捕获,想要捕获崩溃,得先稳定地制造崩溃,本文就教大家在Unity中如何通过C++故意制造崩溃。
二、具体操作
1、C++代码
创建个test.cpp文件,写个接口,故意访问非法内存,这样会抛出SIGSEGV信号,从而引发崩溃,代码如下
#include <iostream>
# define _DLLExport extern "C" __declspec (dllexport)
void signalHandler(int signum)
{
// TODO:处理信号
// 终止程序
exit(signum);
}
_DLLExport void cpp_raise_sigsegv()
{
// 捕获SIGSEGV
signal(SIGSEGV, signalHandler);
// 如下会抛出一个 SIGSEGV信号,SIGSEGV的意思是访问了非法内存
int *p = NULL;
*p = 5;
// 直接抛出一个SIGSEGV信号
//raise(SIGSEGV);
}
2、编译C++代码,生成cppDll.dll
在Windows下,可以使用g++直接编译,大家可以下载个MinGW,它有一整套GNU工具,我们的g++就在其中,还有其他常用的工具,如gdb、nm、gcc等。

关于MinGW的下载与使用,可参见我之前写的这篇文章:
https://blog.csdn.net/linxinfa/article/details/109142964
现在,我们要编译上面的test.cpp,只需执行如下命令即可:
g++ -shared -Wall -o cppDll.dll test.cpp
可以把上面的命令行放在make_dll.bat中,方便运行,如下,执行后生成了cppDll.dll

3、将cppDll.dll拷贝到Unity工程中
将cppDll.dll拷贝到Unity工程的Assets/Plugins目录中

4、Unity C#代码
Unity工程中,创建个Main.cs脚本,代码如下
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehaviour
{
public Button btn;
void Start()
{
btn.onClick.AddListener(() =>
{
Debug.Log("cpp_raise_sigsegv");
cpp_raise_sigsegv();
});
}
[DllImport("cppDll")]
private static extern void cpp_rase_sigsegv();
}
把Main.cs脚本挂到Main Camera上,并赋值btn对象,如下

5、Unity打包exe
Unity工程打包成Windows平台的exe

打包成功,如下

三、测试
运行exe,点击cpp_raise_sigsegv按钮,可以看到程序崩溃了

使用gdb调试exe,可以看到触发了SIGSEGV信号

最后
以上就是耍酷菠萝最近收集整理的关于新发的日常小实验——Unity通过C++制造一个SIGSEGV信号,让程序崩溃的全部内容,更多相关新发内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复