strace'ing java 进程时有很多 SIGSEGV

2022-01-12 00:00:00 segmentation-fault java strace

当我在 CI 服务器(实际上是 maven 构建)上调试其中一个单元测试时,发生了一些有趣的事情.我使用 strace -ff -e trace=network -p [pid] 连接到 java 进程以跟踪构建过程的网络活动.这就是我所看到的:

Interesting stuff occurred while I debug one of the unit tests on CI server (maven build actually). I connect to java process with strace -ff -e trace=network -p [pid] to trace network activity of build process. And that's what I saw:

Process 26324 attached
Process 26325 attached (waiting for parent)
Process 26325 resumed (parent 26312 ready)
Process 26325 detached
Process 26324 detached
Process 26320 detached
Process 26317 detached
Process 26308 resumed
[pid 26308] --- SIGCHLD (Child exited) @ 0 (0) ---
Process 26307 resumed
Process 26308 detached
[pid 26310] --- SIGCHLD (Child exited) @ 0 (0) ---
Process 26310 detached
[pid 25551] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
Process 26309 detached
Process 26307 detached
[pid 25717] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
[pid 25715] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
[pid 25713] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
[pid 25551] socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 163
[pid 25551] setsockopt(163, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
[pid 25551] bind(163, {sa_family=AF_INET, sin_port=htons(6590), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
Process 26471 attached (waiting for parent)
Process 26471 resumed (parent 25551 ready)
[pid 25551] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
[pid 25551] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
[pid 26471] recvfrom(163,  <unfinished ...>
[pid 25551] socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 164
[pid 25551] setsockopt(164, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
[pid 25551] bind(164, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[pid 25551] getsockname(164, {sa_family=AF_INET, sin_port=htons(45728), sin_addr=inet_addr("0.0.0.0")},[16]) = 0
[pid 25551] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
[pid 26471] <... recvfrom resumed> 0x8e80618, 65536, 0, 0x6ef6aea0, 0x6ef6ae9c) = ? ERESTARTSYS (To be restarted)
[pid 26471] --- SIGRT_29 (Real-time signal 27) @ 0 (0) ---
Process 26471 detached
Process 26472 attached (waiting for parent)
Process 26472 resumed (parent 25551 ready)
Process 26473 attached (waiting for parent)
Process 26473 resumed (parent 25551 ready)

所以,我们有一些网络活动(这是我实际搜索的内容),还有很多 SIGSEGV 信号.

So, there we have some network activity (it's what I am actually search for), and a lot of SIGSEGV signals.

构建正确完成(只是一个损坏的测试).情况可确定并一遍又一遍地再现.这是什么意思?

Build finished correctly (just one broken test). Situation determinable and reproduced over and over again. What does this mean?

推荐答案

既然是java,就意味着你的JVM正在使用SIGSEGVs.常见用途包括

Since this is java, it means that your JVM is using SIGSEGVs for something. Common uses include

  • 空指针解引用——JVM 将 SIGSEGV 捕获到地址 0 并将它们转换为 NullPointerExceptions

  • null pointer dereferences -- the JVM catches SIGSEGVs to address 0 and turns them into NullPointerExceptions

垃圾收集写屏障——很少更改的页面被标记为只读,SEGV 捕获对它们的写入.这样垃圾收集器就不必一直重新扫描所有内存.

garbage collection write barriers -- rarely changed pages are marked read only and SEGVs catch writes to them. This way the garbage collector doesn't have to rescan all of memory all of the time.

相关文章