This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM3359:SIGABORT 的调用栈

Guru**** 2546290 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/600762/linux-am3359-callstack-of-sigabort

器件型号:AM3359

工具/软件:Linux

您好、社区

我在 ARM 平台(TI AM335X (3359))上开发多线程应用程序,但调试 coredump 时遇到问题。
在其中一个线程中的上升 sig 中止中、我无法在有用的位置捕获信号。 我只能在信号处理程序中捕获它、但太晚了。 信号处理程序位于 main()中。
源线程没有堆栈。 我只能从信号处理程序的服务例程中看到调用栈。 是否有人知道如何使用标准的调用栈?
我的意思是从 SIGABORT 的起始位置建立一个调用栈。

下面是一些细节...

----------------------------------------------------------------------
来自 coredump 的调用栈:
程序终止信号 SIGABRT、已中止。
 /lib/libc.so.6上的#0 b6b76d14正在升高()
(gdb) bt
 /lib/libc.so.6上的#0 b6b76d14正在升高()
 /lib/libc.so.6上的 abort ()中的#1 b6b7a814
在 __GNU_cxx 中的#2 b6de0dd0::__verbose_terminate_handler (),来自/usr/lib/libstdc
??中的#3b6ddec1c  ()来自/usr/lib/libstdc ++.SO.6

----------------------------------------------------------------------
硬件:
根目录@WIM1:~# cat /proc/cpuinfo
处理器      :0
型号名称     :ARMv7处理器版本2 (v7l)
茂物剪       :795.44
功能       :半拇指 fastmult VFP EDSP thumbee neon vfpv3 TLS vfpd32
CPU 实现者:0x41
CPU 架构:7.
CPU 型号    :0x3.
CPU 部件       :0xc08
CPU 版本   :2.

硬件       :通用 AM33XX (平展设备树)
修订版:       0000
串行         :000000000000

根目录@WIM1:~# uname -a
Linux WIM1 4.1.13-Yocto 标准#1 Thu 4月20日18:07:09 CEST 2017 armv7l GNU/Linux

----------------------------------------------------------------------
封装:
波基-Jethro-14.0.1
arm-poki-linux-gnueabi-gcc-5.2.0

----------------------------------------------------------------------
编译器标志:

arm-poki-linux-gnueabi-g++ -March =armv7-a -mfloat-abi=hard -mfpu=neon -mtUNE=cortex-A8
--sysroot=/Jenkins_data/wim-build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evb
-DHAVE_CONFIG_H
一 一.    i/Jenkins_data/wim-build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evB/usr/include/skybase
-DDBUS API_Subject TO_CHANGE
i/Jenkins_data/wim-build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evB/usr/include/dbus-c++-1
i/Jenkins_data/wim-build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evB/usr/include/dbus-1.0
i/Jenkins_data/wim-build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evB//usr/lib/dbus-1.0/include
-Wall -pipe -std=c++14 -O2 -pipe -g -felime-unused_debug-types -fvisibility-inlines -hidden -c -o DlClassServer.o `test -f 'Classf/DlClassServer.cpp'|| echo './'`Classf/DlClassServer.cpp

链接器标志:

arm-poky-linux-gnueabi-libtool --tag=CXX  --mode=link arm-poky-linux-gnueabi-g++ -March =armv7-a -mfloat-abi=hard -mfpu=neon -mtune =cortex-A8
--sysroot=/Jenkins_data/build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evb
-i/Jenkins_data/build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evB/usr/include/skybase
-DDBUS API_Subject TO_CHANGE
-i/Jenkins_data/build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evB/usr/include/dbus-c++-1
i/Jenkins_data/build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evB/usr/include/dbus-1.0
-i/Jenkins_data/build-standard/skybase/Yocto_build/tmp/sysroots/skyboard-evB//usr/lib/dbus-1.0/include
-wash -pipe -std=c++14 -O2 -pipe -g -felime-unused_debug-types -fvisibility-inLINes-hidden -WL、-O1 -WL、-hash-style=GNU -WL、按需-o
数据记录器*。o
-llog -ldbus-c++-1 -ldbus-1 -leeprom -lskyboard -lutils -llog -lsl -lskyboard -llog -lutils -llog -llog -LED -llog -lhwclock -llog -lllllllllllllrim -lpoost_regex -lboost -lboost -ldoost -lldq -ldst -ldoost -ldq -ldlp -ldlp -ld

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ondrej、

    您是否已经过测试
    BT n

    这应从最内部的 n 帧打印堆栈跟踪。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    感谢您的建议。 我没有尝试过、但我现在已经尝试过。 这是输出。 gdb 似乎无法通过"回扫已停止:上一帧与该帧相同(堆栈损坏?)" 我不认为堆栈已损坏、因为我的大多数 coredump 是"已损坏"的。 我认为这是一种指示前一个线程应该在哪里、但它不在那里。

    程序终止信号 SIGABRT、已中止。
     /lib/libc.so.6上的#0 b6b76d14正在升高()
    (gdb) bt
     /lib/libc.so.6上的#0 b6b76d14正在升高()
     /lib/libc.so.6上的 abort ()中的#1 b6b7a814
    在 __GNU_cxx 中的#2 b6de0dd0::__verbose_terminate_handler (),来自/usr/lib/libstdc
    ??中的#3b6ddec1c  ()来自/usr/lib/libstdc ++.SO.6
    回扫已停止:前一帧与该帧相同(堆栈损坏?)
    (gdb) bt 1
     /lib/libc.so.6上的#0 b6b76d14正在升高()
    (后面会跟随更多堆栈帧...)
    (gdb) bt 2
     /lib/libc.so.6上的#0 b6b76d14正在升高()
     /lib/libc.so.6上的 abort ()中的#1 b6b7a814
    (后面会跟随更多堆栈帧...)
    (gdb) bt 3.
     /lib/libc.so.6上的#0 b6b76d14正在升高()
     /lib/libc.so.6上的 abort ()中的#1 b6b7a814
    在 __GNU_cxx 中的#2 b6de0dd0::__verbose_terminate_handler (),来自/usr/lib/libstdc
    (后面会跟随更多堆栈帧...)
    (gdb) bt 4
     /lib/libc.so.6上的#0 b6b76d14正在升高()
     /lib/libc.so.6上的 abort ()中的#1 b6b7a814
    在 __GNU_cxx 中的#2 b6de0dd0::__verbose_terminate_handler (),来自/usr/lib/libstdc
    ??中的#3b6ddec1c  ()来自/usr/lib/libstdc ++.SO.6
    回扫已停止:前一帧与该帧相同(堆栈损坏?)
    (gdb) bt 5
     /lib/libc.so.6上的#0 b6b76d14正在升高()
     /lib/libc.so.6上的 abort ()中的#1 b6b7a814
    在 __GNU_cxx 中的#2 b6de0dd0::__verbose_terminate_handler (),来自/usr/lib/libstdc
    ??中的#3b6ddec1c  ()来自/usr/lib/libstdc ++.SO.6
    回扫已停止:前一帧与该帧相同(堆栈损坏?)
    (gdb) bt 6.
     /lib/libc.so.6上的#0 b6b76d14正在升高()
     /lib/libc.so.6上的 abort ()中的#1 b6b7a814
    在 __GNU_cxx 中的#2 b6de0dd0::__verbose_terminate_handler (),来自/usr/lib/libstdc
    ??中的#3b6ddec1c  ()来自/usr/lib/libstdc ++.SO.6
    回扫已停止:前一帧与该帧相同(堆栈损坏?)


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您是否认为可以共享您的二进制文件、以便我可以尝试在其中一个平台(AM335x 入门套件或 BBB)上重新创建该文件?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很抱歉耽误你的回答。 我无法共享该二进制文件、因为它太大且具有许多依赖项、但我尝试为您创建一个简单的示例、在那里我可以看到正确的调用栈。 然后、我对其进行了调查并尝试修复、问题出在 side..between 上的椅子和键盘上。 :)我的信号处理程序可以执行返回操作,根本不调用默认的信号处理程序。 我的信号处理程序末尾的一行修复了我的问题:

    信号(SIG、SIG_DFL);

    感谢您的参与和意愿、

    Ondro

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yordan、您好!

    我又遇到了同样的问题。 我使用 abort()函数测试了该应用程序,并修复了该应用程序。 现在,我已经尝试使用 assert()函数,并且 coredump 已损坏或无法使用。 两者都生成 SIGABRT。 我已经上传了二进制代码和源代码以及测试(示例)应用的转储: https://mega.nz/fm/BmxBwb5C

    这是一个简单的应用程序,其中一个已创建的线程在主循环中是 assert()。

    BR、

    Ondro