77import java .util .Set ;
88import java .util .concurrent .ConcurrentHashMap ;
99import java .util .concurrent .atomic .AtomicInteger ;
10+
11+ import org .apache .logging .log4j .LogManager ;
12+ import org .apache .logging .log4j .Logger ;
1013import org .clyze .doop .common .InstrInfo ;
1114import org .clyze .doop .common .Phantoms ;
1215import org .clyze .doop .common .SessionCounter ;
@@ -34,6 +37,8 @@ class FactGenerator implements Runnable {
3437 private final SootParameters sootParameters ;
3538 private final SootDriver _driver ;
3639
40+ private static final Logger logger = LogManager .getLogger (FactGenerator .class );
41+
3742 FactGenerator (FactWriter writer , Set <SootClass > sootClasses , SootDriver driver , SootParameters sootParameters , Phantoms phantoms )
3843 {
3944 this ._writer = writer ;
@@ -46,55 +51,87 @@ class FactGenerator implements Runnable {
4651
4752 @ Override
4853 public void run () {
49- final boolean ignoreErrors = _driver ._ignoreFactGenErrors ;
54+ logger .info ("start generate facts" );
55+ try {
56+ final boolean ignoreErrors = _driver ._ignoreFactGenErrors ;
5057
51- if (!ignoreErrors && _driver .errorsExist ())
52- return ;
58+ if (!ignoreErrors && _driver .errorsExist ())
59+ return ;
60+
61+ for (SootClass _sootClass : _sootClasses ) {
62+ try {
63+ _writer .writeClassOrInterfaceType (_sootClass );
64+
65+ for (String mod : getModifiers (_sootClass .getModifiers (), false ))
66+ if (!mod .trim ().equals ("" ))
67+ _writer .writeClassModifier (_sootClass , mod );
5368
54- for (SootClass _sootClass : _sootClasses ) {
55- _writer .writeClassOrInterfaceType (_sootClass );
69+ // the isInterface condition prevents Object as superclass of interface
70+ if (_sootClass .hasSuperclass () && !_sootClass .isInterface ()) {
71+ _writer .writeDirectSuperclass (_sootClass , _sootClass .getSuperclass ());
72+ }
5673
57- for (String mod : getModifiers ( _sootClass .getModifiers (), false ))
58- if (! mod . trim (). equals ( "" ))
59- _writer . writeClassModifier ( _sootClass , mod );
74+ for (SootClass i : _sootClass .getInterfaces ()) {
75+ _writer . writeDirectSuperinterface ( _sootClass , i );
76+ }
6077
61- // the isInterface condition prevents Object as superclass of interface
62- if (_sootClass .hasSuperclass () && !_sootClass .isInterface ()) {
63- _writer .writeDirectSuperclass (_sootClass , _sootClass .getSuperclass ());
78+ _sootClass .getFields ().forEach (this ::generate );
79+
80+ for (SootMethod m : new ArrayList <>(_sootClass .getMethods ())) {
81+ SessionCounter session = new SessionCounter ();
82+ try {
83+ generate (m , session );
84+ } catch (Throwable t ) {
85+ // Map<Thread,StackTraceElement[]> liveThreads = Thread.getAllStackTraces();
86+ // for (Iterator<Thread> i = liveThreads.keySet().iterator(); i.hasNext(); ) {
87+ // Thread key = i.next();
88+ // logger.error("Thread " + key.getName());
89+ // StackTraceElement[] trace = liveThreads.getLibrary(key);
90+ // for (int j = 0; j < trace.length; j++) {
91+ // logger.error("\tat " + trace[j]);
92+ // }
93+ // }
94+ String msg = "Error while processing method: " + m ;
95+ logger .error (msg , t );
96+ if (!ignoreErrors ) {
97+ // Inform the driver. This is safer than throwing an
98+ // exception, since it could be lost due to the executor
99+ // service running this class.
100+ _driver .markError ();
101+ return ;
102+ }
103+ }
104+ }
105+ }catch (Exception e ){
106+ if (_sootClass != null ){
107+ logger .error ("handle class {}.{} error" ,_sootClass .getJavaStyleName (), e );
108+ }
109+ }
64110 }
65111
66- for ( SootClass i : _sootClass . getInterfaces ()) {
67- _writer . writeDirectSuperinterface ( _sootClass , i );
112+ if ( sootParameters . _lowMem && ! sootParameters . _generateJimple ) {
113+ gcMethodBody ( _sootClasses );
68114 }
115+ }catch (Exception e ){
116+ logger .error ("FactGenerator run occur error " , e );
117+ }
69118
70- _sootClass . getFields (). forEach ( this :: generate );
119+ logger . info ( "finish generator facts" );
71120
72- for (SootMethod m : new ArrayList <>(_sootClass .getMethods ())) {
73- SessionCounter session = new SessionCounter ();
74- try {
75- generate (m , session );
76- } catch (Throwable t ) {
77- // Map<Thread,StackTraceElement[]> liveThreads = Thread.getAllStackTraces();
78- // for (Iterator<Thread> i = liveThreads.keySet().iterator(); i.hasNext(); ) {
79- // Thread key = i.next();
80- // System.err.println("Thread " + key.getName());
81- // StackTraceElement[] trace = liveThreads.getLibrary(key);
82- // for (int j = 0; j < trace.length; j++) {
83- // System.err.println("\tat " + trace[j]);
84- // }
85- // }
86- String msg = "Error while processing method: " + m + ": " + t .getMessage ();
87- System .err .println (msg );
88- if (!ignoreErrors ) {
89- // Inform the driver. This is safer than throwing an
90- // exception, since it could be lost due to the executor
91- // service running this class.
92- _driver .markError ();
93- return ;
94- }
121+ }
122+
123+ private void gcMethodBody (Set <SootClass > sootClasses ){
124+ logger .info ("start gcMethodBody" );
125+ for (SootClass sootClass : sootClasses ) {
126+ for (SootMethod method : sootClass .getMethods ()) {
127+ if (method .hasActiveBody ()){
128+ method .setActiveBody (null );
95129 }
96130 }
97131 }
132+ logger .info ("start System.gc" );
133+ System .gc ();
134+ logger .info ("finish gcMethodBody" );
98135 }
99136
100137 private void generate (SootField f )
@@ -207,7 +244,7 @@ void generate(SootMethod m, SessionCounter session) {
207244 m .retrieveActiveBody ();
208245 // } // synchronizing so broadly = giving up on Soot's races
209246
210- // System.err.println ("Found method without active body: " + m.getSignature());
247+ // logger.error ("Found method without active body: " + m.getSignature());
211248 methodsWithoutActiveBodies .incrementAndGet ();
212249 }
213250
@@ -227,8 +264,7 @@ void generate(SootMethod m, SessionCounter session) {
227264 m .setActiveBody (b0 );
228265 }
229266 } catch (RuntimeException ex ) {
230- System .err .println ("Fact generation failed for method " + m .getSignature () + "." );
231- ex .printStackTrace ();
267+ logger .error ("Fact generation failed for method " + m .getSignature () + "." , ex );
232268 throw ex ;
233269 }
234270 }
@@ -345,7 +381,7 @@ private void generatePhantom(Object cause) {
345381 else if (cause instanceof SootMethod )
346382 _writer .writePhantomMethod (_writer ._rep .signature ((SootMethod )cause ));
347383 else
348- System . err . println ("Ignoring phantom cause: " + cause );
384+ logger . error ("Ignoring phantom cause: " + cause );
349385 }
350386
351387 /**
0 commit comments