strace’ing java进程时有很多SIGSEGV

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

 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,  [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]  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信号。

构建完成正确(只有一个损坏的测试)。 情况可以一次又一次地确定和再现。 这是什么意思?

由于这是java,这意味着您的JVM正在使用SIGSEGV。 常见用途包括

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

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