return err;
        }
 
-       if (raw_samples) {
+       if (raw_samples && have_tracepoints(attrs, nr_counters)) {
                perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
        } else {
                for (i = 0; i < nr_counters; i++) {
-                       if (attrs[i].sample_type & PERF_SAMPLE_RAW) {
+                       if (attrs[i].sample_type & PERF_SAMPLE_RAW &&
+                               attrs[i].type == PERF_TYPE_TRACEPOINT) {
                                perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
                                break;
                        }
                        return err;
                }
 
-               err = event__synthesize_tracing_data(output, attrs,
-                                                    nr_counters,
-                                                    process_synthesized_event,
-                                                    session);
-               /*
-                * FIXME err <= 0 here actually means that there were no tracepoints
-                * so its not really an error, just that we don't need to synthesize
-                * anything.
-                * We really have to return this more properly and also propagate
-                * errors that now are calling die()
-                */
-               if (err > 0)
+               if (have_tracepoints(attrs, nr_counters)) {
+                       /*
+                        * FIXME err <= 0 here actually means that
+                        * there were no tracepoints so its not really
+                        * an error, just that we don't need to
+                        * synthesize anything.  We really have to
+                        * return this more properly and also
+                        * propagate errors that now are calling die()
+                        */
+                       err = event__synthesize_tracing_data(output, attrs,
+                                                            nr_counters,
+                                                            process_synthesized_event,
+                                                            session);
+                       if (err <= 0) {
+                               pr_err("Couldn't record tracing data.\n");
+                               return err;
+                       }
                        advance_output(err);
+               }
        }
 
        machine = perf_session__find_host_machine(session);
 
        return nr_tracepoints > 0 ? path.next : NULL;
 }
 
+bool have_tracepoints(struct perf_event_attr *pattrs, int nb_events)
+{
+       return get_tracepoints_path(pattrs, nb_events) ? true : false;
+}
+
 int read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events)
 {
        char buf[BUFSIZ];