在strace';使用java进程

在strace';使用java进程,java,segmentation-fault,strace,Java,Segmentation Fault,Strace,当我调试CI服务器上的一个单元测试(实际上是maven build)时,发生了一些有趣的事情。我使用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 Pro

当我调试CI服务器上的一个单元测试(实际上是maven build)时,发生了一些有趣的事情。我使用
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,  <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)
过程26324已附加
已连接进程26325(正在等待父进程)
进程26325已恢复(父级26312已就绪)
进程26325
进程26324已分离
进程26320分离
进程26317
进程26308恢复
[pid 26308]——SIGCHLD(子项退出)@0(0)---
程序26307恢复
进程26308已分离
[pid 26310]——SIGCHLD(子项退出)@0(0)---
进程26310已分离
[pid 25551]——SIGSEGV(分段故障)@0(0)---
进程26309已分离
进程26307已分离
[pid 25717]——SIGSEGV(分段故障)@0(0)---
[pid 25715]——SIGSEGV(分段故障)@0(0)---
[pid 25713]——SIGSEGV(分段故障)@0(0)---
[pid 25551]插座(PF INET、SOCK DGRAM、IPPROTO IP)=163
[pid 25551]setsockopt(163,SOL_插槽,SO_广播,[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
已连接进程26471(正在等待父进程)
进程26471已恢复(父进程25551就绪)
[pid 25551]——SIGSEGV(分段故障)@0(0)---
[pid 25551]——SIGSEGV(分段故障)@0(0)---
[pid 26471]从(163,
[pid 25551]插座(内部插座、插座、IP协议)=164
[pid 25551]setsockopt(164,SOL_插槽,SO_广播,[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(分段故障)@0(0)---
[pid 26471]0x8e80618、65536、0、0x6ef6aea0、0x6ef6ae9c)=?ERESTARTSYS(待重新启动)
[pid 26471]——SIGRT_29(实时信号27)@0(0)---
进程26471已分离
已连接进程26472(正在等待父进程)
进程26472已恢复(父进程25551就绪)
已连接进程26473(正在等待父进程)
进程26473已恢复(父进程25551就绪)
因此,我们有一些网络活动(这就是我实际搜索的内容),以及大量的
SIGSEGV
信号


正确完成构建(仅一个中断的测试)。情况是可以确定的,并且反复出现。这意味着什么?

由于这是java,这意味着您的JVM正在使用SIGSEGVs进行某些操作。常见用途包括

  • null指针解引用——JVM捕获SIGSEGVs到地址0,并将其转换为NullPointerException

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


非常有趣,谢谢!你能提供一些链接,让我能找到更多关于这些东西的信息吗?那么这是无害的还是应该解决的?我在solaris上通过truss运行的应用程序上看到了类似的情况。我认为没有必要担心:)当您使用JNI时,第二点是非常危险的,该部分会阻止所有信号(分别是SIGV)。然后,应用程序将遇到非常随机的SIGSEGV触发的崩溃(看起来像竞争条件或无效内存访问),这些崩溃很难跟踪。@spl:如果程序运行正常,那么是的,这些SIGSEGV实际上是NullPointerException