I get it now. A "normal exit" just means the JVM didn't crash. The bug that's preventing me from getting a populated sonar.exec is that under the right race conditions the shutdown hook doesn't run so it isn't anything to do with the exit code of the running process.
Thank you so much for the help! On Thursday, April 14, 2016 at 2:56:00 PM UTC-4, Marc R. Hoffmann wrote: > I don't think the exit code matters: > You can properly shut down the JVM with e.g. System.exit(-1) and > still get an proper exec dump. > > > > Regards, > > -marc > > > > On 14.04.16 16:35, Adam Gresh wrote: > > > > > That thread does indeed sound familiar and > certainly could account for the behavior I'm seeing. Since I'm > running through ant it's tough to get the exit code for the > JVM. If I want to verify this as the cause it seems like I will > have to kick off TestNG from the command line, which is not > trivial in my case due to a complex classpath and the arguments > i'm using right now for TestNG. I'm not sure they are all > supported. > > > > > > Thank you for the information, very helpful. > > > > > > On Wed, Apr 13, 2016 at 2:23 PM, Marc > Hoffmann <[email protected]> > wrote: > > Hi, > > > > if exec files are not generated at all, or clipped somewhere > in the middle (as you stack trace suggests) this is > typically due to a non-graceful shutdown of the JVM running > the tests. > > > > Just this week we identified a JVM bug which causes > corrupted exec files under a specific condition, see: > https://github.com/jacoco/jacoco/issues/394 > > > > You might check whether the main thread or the thread > finally calling System.exit() is in the interrupted state. > > > > Regards, > > -marc > > > > > > > > On 2016-04-11 23:51, [email protected] > wrote: > > > Hi All, > > > > I love the coverage metrics that I get out of > TestNG/jacoco when I get > > them, but I'm having a problem that's been unsolvable > so far. > > > > We're using ant as our build platform, TestNG in > "mixed" mode to run > > mostly JUnit, but also some TestNG tests, with Jenkins > for CI. With > > EXACTLY THE SAME CONFIGURATION sometimes a build will > generate a 1.3M > > jacoco.exec (~500k lines of code in the project) and > other times it > > generates an empty file (0 bytes). > > > > I *suspect* that something is causing the jvm to exit > with a non-zero > > return code since the documentation for jacoco says > stats are only > > generated if the jvm exits normally. Here's my > setup... > > > > java version "1.7.0_76" > > Apache Ant(TM) version 1.9.3 > > junit 4.11 > > testng 6.8 > > > > A trigger kicks off the jenkins build. The trigger is > the throttle > > (only 1 job can run at a time) and the build runs by > calling other > > jobs sequentially and blocking until all steps > complete. > > > > Step 1 is the trigger, it deletes artifacts using a > shell script... > > > > if [ -f ./sonar/reports/jacoc.exec ] ; then echo > "Removing > > ./sonar/report/jacoco.exec" ; rm -rf > ./sonar/report/jacoco.exec ; else > > echo "No ./sonar/report/jacoco.exec." ; fi ; > > if [ -d ./sonar/report/debug ] ; then echo "Removing > > ./sonar/report/debug" ; rm -rf ./sonar/report/debug ; > else echo "No > > ./sonar/report/debug" ; fi ; > > if [ -d ./sonar/report/junit ] ; then echo "Removing > > ./sonar/report/junit" ; rm -rf ./sonar/report/junit ; > else echo "No > > ./sonar/report/junit" ; fi ; > > > > Step 2 is a compile job that compiles the source and > test code into a > > working directory. > > > > (script not included) > > > > Step 3 is calling a shell script to eliminate any > possibility of the > > jvm being shared with anything else, even though > testng theoretically > > always forks, just to be really, really, really > sure... > > > > #!/bin/bash > > echo invoking ant build... > > cd sonar > > /opt/local/ant/bin/ant -file build.xml run-tests > > cd .. > > > > The code has already been compiled into a working > directory, there's a > > throttle on the upstream job that prevents other jobs > from running - > > this is the only thing happening in the working > directory at this > > time, I swear! The build step looks like... > > > > <property name="build.dir" > value="${basedir}/build" /> > > <property name="app.name" value="XXXXXXXXXXXX" > /> > > <property name="build.app.dir" > value="${build.dir}/${app.name}" /> > > <property name="build.outputDir" > value="${build.app.dir}/WEB-INF/classes"/> > > <property name="test.src.dir" > value="test"/> > > <property name="test.resource.dir" > value="test/resources"/> > > <property name="jacoco.exec" > value="../sonar/report/jacoco.exec"/> > > <property name="report.dir" > value="../sonar/report/"/> > > <property name="junit.report" > value="../sonar/report/junit/junitreports/"/> > > > > <taskdef uri="antlib:org.jacoco.ant" > > resource="org/jacoco/ant/antlib.xml" > > classpath="../sonar/lib/jacocoant.jar"> > > </taskdef> > > > > <taskdef name="testng" > classname="org.testng.TestNGAntTask"> > > <classpath> > > <pathelement > location="../sonar/lib/testng-6.8.jar" /> > > </classpath> > > </taskdef> > > > > <target name="run-tests" description="Run > unit tests to get code > > coverage metrics"> > > > > <jacoco:coverage > > destfile="${jacoco.exec}" > > append="true" > > > classdumpdir="../sonar/report/debug/" > > enabled="true" > > > includes="com/XXXXXXX/**.*:com/XXXXXXXXX/**.*" > > sessionId="1" > > output="file" > > dumpOnExit="true"> > > <testng > > mode="mixed" > > > workingDir="${basedir}" > > > classfilesetref="unit.tests.fileset" > > > outputdir="../sonar/report/junit" > > > suitename="junitreports" > > verbose="2" > > > haltonfailure="false"> > > <classpath> > > <path > refid="test.classpath" /> > > > <pathelement location="${build.dir}/test/classes" > /> > > > <pathelement location="${build.outputDir}" /> > > > <pathelement location="${test.resource.dir}" /> > > </classpath> > > <jvmarg > line="-Xmx4096m -XX:PermSize=512m > -XX:MaxPermSize=2048m > > -Duser.timezone=UTC -XX:-UseGCOverheadLimit"/> > > <jvmarg > value="-Dfips.provider=SunRsaSign" /> > > </testng> > > </jacoco:coverage> > > > > </target> > > > > The next step to try to get this to work, I guess, is > to run the whole > > thing from the command line as a direct invocation of > TestNG outside > > of ant with the jacoco command line args passed. That > seems a very, > > very brute force way to go, but there doesn't seem to > be any practical > > way to debug the exit code from testNG and I'm getting > these empty > > files... > > > > Verifying jacoco.exec... > > /var/lib/jenkins/workspace/XXXXXXXXX-sonar-bugfix > > Found ./sonar/report/jacoco.exec > > -rw-r--r-- 1 jenkins jenkins 0 Apr 11 21:12 > ./sonar/report/jacoco.exec > > > > ...so that's where I'm headed now, but I'm not full of > hope and > > enthusiasm for this solution. If I do find I'm > getting a non-zero > > return code I'm going to have to go diving through the > TestNG code. > > If I don't then I'm going to be really stuck. Surely > this must be > > some kind of race condition...??? > > > > If anyone has any insights about where I may have > stumbled or knows > > what the problem is it would surely make me smile! > > > > > -- > > You received this message because you are subscribed to > a topic in the Google Groups "JaCoCo and EclEmma Users" > group. > > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/jacoco/ErZL3TJsDqc/unsubscribe. > > To unsubscribe from this group and all its topics, send > an email to [email protected]. > > > > To view this discussion on the web visit > https://groups.google.com/d/msgid/jacoco/f0e0ff7b6142736dd47c97329d32f52c%40mountainminds.com. > > > > > > For more options, visit https://groups.google.com/d/optout. > > > > > > > > > > > > > > -- > > > > > Adam Gresh > > [email protected] > > Phone: (561) > 376-2622 > > -- > > You received this message because you are subscribed to the Google > Groups "JaCoCo and EclEmma Users" group. > > To unsubscribe from this group and stop receiving emails from it, > send an email to [email protected]. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/jacoco/CALERUf1SKThrF%3DOtiz-5_GZjg59yHuvgMvO_Q08DGx2JF2s-RA%40mail.gmail.com. > > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "JaCoCo and EclEmma Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/jacoco/41a2d7a7-e87f-4a34-a7df-dbd1d272d9bc%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
