我是靠谱客的博主 耍酷菠萝,最近开发中收集的这篇文章主要介绍新发的日常小实验——Unity通过C++制造一个SIGSEGV信号,让程序崩溃,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

      • 一、前言
      • 二、具体操作
        • 1、C++代码
        • 2、编译C++代码,生成cppDll.dll
        • 3、将cppDll.dll拷贝到Unity工程中
        • 4、Unity C#代码
        • 5、Unity打包exe
      • 三、测试

一、前言

最近在搞UnityWindows平台的崩溃捕获,想要捕获崩溃,得先稳定地制造崩溃,本文就教大家在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++就在其中,还有其他常用的工具,如gdbnmgcc等。
在这里插入图片描述
关于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信号,让程序崩溃所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部