public DFS addAddressFiles(String... fileNames) throws Throwable {
    Set<Integer> s = new HashSet<Integer>();
    byte[] buf = new byte[4];
    int numRead = 0;
    int numInserted = 0;
    for(String fileName : fileNames) {
      InputStream is = new BufferedInputStream(new FileInputStream(fileName));
      while(is.read(buf) != -1) {
        numRead++;
        if(numRead % 1000000 == 0)
          System.out.println("processed "+numRead+" ("+numInserted+")...");
        int add = ((buf[3]&0xFF) << 24) | ((buf[2]&0xFF) << 16) | ((buf[1]&0xFF) << 8) | (buf[0]&0xFF);
        if(!s.contains(add)) {
          s.add(add);
          dfsStack.push(new DFSStackElem(add, new CPUState(), true));
          numInserted++;
        }
      }
      is.close();
    }
    System.out.println("inserted "+numInserted+" of "+numRead+" traces");

    return this;
  }