13

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

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信号。

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

4

1 回答 1

20

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

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

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

于 2010-09-17T00:16:22.883 回答