问题描述
当我调试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正在使用SIGSEGV。常见用途包括
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.
这篇关于strace'ing java进程时有很多SIGSEGV的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!