 +	EvGoRecv:         {"GoRecv", true, []string{}},
  }
 diff --git a/src/runtime/chan.go b/src/runtime/chan.go
-index 5be18be..9c6ff9d 100644
+index 5be18be..4966723 100644
 --- a/src/runtime/chan.go
 +++ b/src/runtime/chan.go
 @@ -23,6 +23,7 @@ const (

 }
 
 type gcstats struct {
diff --git a/src/runtime/trace.go b/src/runtime/trace.go
index 805c34f..6f1c5ed 100644
--- a/src/runtime/trace.go

 	// someone woke us up
 	if mysg != gp.waiting {
 		throw("G waiting list is corrupted")
@@ -507,6 +534,7 @@ func recv(c *hchan, sg *sudog, ep unsafe.Pointer, unlockf func()) {
 			// ep points to our own stack or heap, so nothing
 			// special (ala sendDirect) needed here.
 			typedmemmove(c.elemtype, ep, sg.elem)
+			traceGoRecv(sg.eventid, c.id, elem2int(ep))
 		}
 	} else {
 		// Queue is full.  Take the item at the
@@ -526,6 +554,7 @@ func recv(c *hchan, sg *sudog, ep unsafe.Pointer, unlockf func()) {
 		}
 		// copy data from sender to queue
 		typedmemmove(c.elemtype, qp, sg.elem)
+		traceGoRecv(sg.eventid, c.id, elem2int(ep))
 		c.recvx++
 		if c.recvx == c.dataqsiz {
 			c.recvx = 0
@@ -687,3 +716,10 @@ func racesync(c *hchan, sg *sudog) {
 	racereleaseg(sg.g, chanbuf(c, 0))
 	raceacquire(chanbuf(c, 0))
 }
