signal 6 (SIGABRT), code -6 (SI_TKILL) Abort message: ‘stack corruption detected (-fstack-protector

在测试调用native的rw_i93.cc文件的rw_i93_sm_format函数时,出现程序crash,报错信息如下

12-18 11:19:39.056  1453  2114 I WifiStateMachine: checkScoreBasedQuality -  mPreviousScore[0]:81 mPreviousScore[1]:81 mPreviousScore[2]:81 s2Score:80mPrevoiusScoreAverage:81
12-18 11:19:39.113 18417 18417 I crash_dump64: obtaining output fd from tombstoned, type: kDebuggerdTombstone
12-18 11:19:39.115  1066  1066 I /system/bin/tombstoned: received crash request for pid 18414
12-18 11:19:39.118 18417 18417 I crash_dump64: performing dump of process 18414 (target tid = 18414)
12-18 11:19:39.138 18417 18417 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
12-18 11:19:39.139 18417 18417 F DEBUG   : Build fingerprint: 'samsung/dreamqltezc/dreamqltechn:9/PPR1.180610.011/G9500ZCS6DTJ1:user/release-keys'
12-18 11:19:39.139 18417 18417 F DEBUG   : Revision: '12'
12-18 11:19:39.139 18417 18417 F DEBUG   : ABI: 'arm64'
12-18 11:19:39.139 18417 18417 F DEBUG   : pid: 18414, tid: 18414, name: ServiceHandlerB  >>> com.weiqing.wheeljack:CaseHandlerService <<<
12-18 11:19:39.139 18417 18417 F DEBUG   : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
12-18 11:19:39.139 18417 18417 F DEBUG   : Abort message: 'stack corruption detected (-fstack-protector)'
12-18 11:19:39.139 18417 18417 F DEBUG   :     x0  0000000000000000  x1  00000000000047ee  x2  0000000000000006  x3  0000000000000008
12-18 11:19:39.139 18417 18417 F DEBUG   :     x4  0000000000000000  x5  0000000000000000  x6  0000000000000000  x7  0000000000000030
12-18 11:19:39.139 18417 18417 F DEBUG   :     x8  0000000000000083  x9  6b3556791e691e70  x10 0000000000000000  x11 fffffffc7ffffbdf
12-18 11:19:39.139 18417 18417 F DEBUG   :     x12 0000000000000001  x13 000000005fdc1fca  x14 0039d2de21f52580  x15 0000591ef0ff6dfc
12-18 11:19:39.139 18417 18417 F DEBUG   :     x16 0000007418a192a0  x17 0000007418939f24  x18 6b3556791e691e70  x19 00000000000047ee
12-18 11:19:39.139 18417 18417 F DEBUG   :     x20 00000000000047ee  x21 0000000000000000  x22 0000007379f08984  x23 0000007379dd1f33
12-18 11:19:39.139 18417 18417 F DEBUG   :     x24 0000007379f37a30  x25 000000737b9f3588  x26 0000007379f35a68  x27 6b3556791e691e70
12-18 11:19:39.139 18417 18417 F DEBUG   :     x28 000000737b9f16f0  x29 000000737b9f1570
12-18 11:19:39.139 18417 18417 F DEBUG   :     sp  000000737b9f1530  lr  000000741892c304  pc  000000741892c32c
12-18 11:19:39.161  1453  2113 D WifiPermissionsUtil: canAccessScanResults: pkgName = android, uid = 1000
12-18 11:19:39.162  2194  2194 D SecStatusBarWifiView: updateState: WifiIconState(resId=2131232630, visible=true, activityId=2131232635)

 

最后发现是因为编译器开启了GCC “stack smashing detected”机制(堆栈保护程序。堆栈保护程序是由编译器生成并放入程序中的代码),用来访者“栈溢出”。如果使用-fstack protector进行编译,那么在堆栈上分配的空间会多一点,在进入和返回函数时,代码会设置检查,然后在函数中实际检查是否覆盖了堆栈。这将对你的申请产生影响。如果启用,它将迅速阻止堆栈溢出攻击。只有在代码中没有函数调用的情况下,程序才会不受影响(由于通常编写main(),而这是一个由启动代码调用的函数,它将对程序产生影响)。但是,堆栈溢出攻击并不是唯一可以使用的攻击,因此它不是万能的。但它是一种有用的保护措施,成本有限。

常见的栈溢出情况如下:

#include <string.h>
#include <stdio.h>

int main(void)
{
    char array[10] = {0};

    strcpy(array, "stackoverflow");

    return 0;
}

解决上面的问题是在调用rw_i93_sm_format函数的代码的android.mk文件的LOCAL_CFLAGS编译器标记加上-fno-stack-protector这个编译选项,把“stack smashing detected”机制关闭即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个程序错误信号,信号编号为6 (SIGABRT),表示由于某些原因程序请求终止。而 code -6 (SI_TKILL) 是信号的附加信息,指示进程是被另一个进程(或线程)终止的。fault addr 表示导致程序终止的内存地址。 SIGABRT信号通常是由程序自己发出的,它可以表示一些严重的问题,例如不可恢复的错误或不合法的操作。通常这个错误信息会在程序崩溃时出现,可以通过查看程序的日志或调试信息来确定具体原因。 其中,fault addr 可以帮助定位程序错误的位置。它表示程序崩溃时所在的内存地址,这个地址可以通过调试工具查看。在分析程序错误时,可以结合这个地址来确定具体出现了哪些问题。 ### 回答2: signal 6 (SIGABRT), code -6 (SI_TKILL)是一种Linux系统产生的错误信号。这个错误通常指示了一个严重的问题,导致程序异常终止。SIGABRT信号是由程序自身通过调用abort()函数来产生的,用于终止一个异常情况下的程序执行。 code -6 (SI_TKILL)表示该信号是通过系统调用tkill()发送的。这种方式是一种线程之间用于发送信号的机制。 fault addr即“故障地址”,它指示了在程序运行过程中发生错误的内存地址。这个地址可能会有助于我们定位和调试问题。 综上所述,根据给出的错误信息,我们可以确定程序在执行过程中遇到了严重的问题,导致了异常终止。但具体的错误原因和故障地址需要进一步的调试和分析来确定。 ### 回答3: signal 6 (SIGABRT),code -6 (SI_TKILL)是指程序发现了一个严重的错误,并主动终止了自身。SIGABRT信号通常是由于程序调用了abort()函数或出现了某些不可恢复的错误导致的。code -6 (SI_TKILL)表示信号是由系统通过tkill系统调用发送的。 fault addr表示了引发错误的地址。它指示了程序在哪个内存地址上发生了错误。这个地址可能是一个无效的指针、空指针、未初始化的变量、越界访问等。 需要根据具体的程序运行环境和代码来进一步分析错误原因。一般情况下,signal 6 (SIGABRT),code -6 (SI_TKILL)错误表明程序发生了严重的错误,可能是由于逻辑错误、内存泄漏、缓冲区溢出、非法指针操作等引起的。通过查看错误信息和堆栈跟踪信息,可以进一步定位错误的具体原因并进行修复。同时,建议在代码中添加适当的异常处理机制,以避免类似错误的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值