libgcc_s.so冲突可能导致使用异常的cpu过载

libgcc_s.so conflicts could lead to cpu overload using exceptions?

本文关键字:异常 过载 cpu so 冲突 libgcc      更新时间:2023-10-16

我为嵌入式i386兼容环境开发了一个C++服务器应用程序,因此不需要交叉编译器。由学院开发的动态库,(大量(使用异常技术。该库是实现网络通信所必需的,一旦复制到目标文件系统中,在客户端连接后,会导致中止,并显示常见消息:抛出的实例后,终止即使libstdc++在嵌入式操作系统上可用。

经过几次尝试,包括库的静态链接,我们显然找到了一个解决方案,只需将编译时在Fedora3虚拟机上使用的libgcc_s.so.1复制到嵌入式文件系统,并使用环境变量LD_LIBRARY_PATH=路径启动服务器,即可到达fedora-lib

在嵌入式操作系统上,我们有一个繁忙的盒子,工具很少,而且减少了,但我们注意到,随着命令的正常运行时间,客户端连接后,cpu使用率从20%提高到100%(我不知道如何……甚至更多(。第一印象是一个应用程序错误,但在Fedora机器上的调试会话中从未注意到,如果您在/proc/task/status上看到,您将看到以下日志:

    Name:   taskname
State:  S (sleeping)
SleepAVG:       97%
Tgid:   589
Pid:    589
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0
VmSize:     3396 kB
VmLck:         0 kB
VmRSS:      1604 kB
VmData:      492 kB
VmStk:        84 kB
VmExe:        84 kB
VmLib:      2512 kB
VmPTE:        20 kB
Threads:        1
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000080000000
SigIgn: 0000000000001004
SigCgt: 0000000380004a02
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff

因此,即使客户端断开连接,我也无法确定谁在大量使用cpu。如果服务器是在Fedora机器上启动的,则不会出现这种行为。我怀疑将Fedora3-libgcc_s.so.1与嵌入式系统混合可能会产生一些奇怪的副作用,但我对此一无所知。

所以我开始寻找另一种部署服务器的方法:

  1. 将其他必需的库从Fedora3复制到嵌入式so(libstdc++和libc(。相同行为

  2. 反转过程:将所需的库复制到源树,并强制链接器使用这些库。启动应用程序(编译器端(时,错误消息在抛出的实例后终止重生。

其他信息:如果有用的话:在这两个库上应用ldd-vlibgcc_s.so.1(在嵌入式系统上不可用(,我得到了以下结果:

主机库:

    libc.so.6 => /lib/tls/libc.so.6 (0x00694000)
/lib/ld-linux.so.2 (0x0067b000)
Version information:
/lib/libgcc_s.so.1:
    libc.so.6 (GLIBC_2.2.4) => /lib/tls/libc.so.6
    libc.so.6 (GLIBC_2.1.3) => /lib/tls/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/tls/libc.so.6
/lib/tls/libc.so.6:
    ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2

嵌入式库:

    libc.so.6 => /lib/tls/libc.so.6 (0xf6ec3000)
/lib/ld-linux.so.2 (0x0067b000)
Version information:
./libgcc_s.so.1:
    libc.so.6 (GLIBC_2.1.3) => /lib/tls/libc.so.6
    libc.so.6 (GLIBC_2.0) => /lib/tls/libc.so.6
/lib/tls/libc.so.6:
    ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
    ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2

有人有什么解释或建议吗?谢谢

A。Cappelli

有关处理器类型的更多信息:

编译器主机/proc/cpuinfo:

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 15
model   : 4
model name  : Intel(R) Xeon(TM) CPU 3.40GHz
stepping    : 1
cpu MHz     : 3390.524
cache size  : 1024 KB
fdiv_bug    : no
hlt_bug     : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 5
wp      : yes
flags   : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36
              clflush dts acpi mmx fxsr sse sse2 ss nx pni
bogomips    : 6471.68

嵌入式机器/proc/cpu_info:

processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 4
model           : 9
model name      : 486 DX/4-WB
stepping        : 4
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu
bogomips        : 65.40

如果您的嵌入式系统有足够的最新版本的Linux内核,您可以尝试使用Linux性能计数器(perf(。安装它们时,请在嵌入式系统上运行perf record ./server。这将在服务器退出时生成perf.data。之后,您可以在与文件相同的目录中使用perf report来分析文件。它将显示每个库和可执行符号使用了多少CPU%。然后,您可以将问题缩小到库或服务器代码。有关性能的更多信息,请点击此处