概述
文章目录
- 一、前言
- 二、具体操作
- 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信号,让程序崩溃的全部内容,希望文章能够帮你解决新发的日常小实验——Unity通过C++制造一个SIGSEGV信号,让程序崩溃所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复