@@ -42,6 +42,20 @@ extern int events_enabled;
4242#define ETW_WRITE_INT32_DATA (data_descriptor, data ) \
4343 EventDataDescCreate (data_descriptor, data, sizeof (int32_t ));
4444
45+ #define ETW_WRITE_INT64_DATA (data_descriptor, data ) \
46+ EventDataDescCreate (data_descriptor, data, sizeof (int64_t ));
47+
48+ #define ETW_WRITE_ADDRESS_DATA (data_descriptor, data ) \
49+ EventDataDescCreate (data_descriptor, data, sizeof (intptr_t ));
50+
51+ #define ETW_WRITE_INT16_DATA (data_descriptor, data ) \
52+ EventDataDescCreate (data_descriptor, data, sizeof (int16_t ));
53+
54+ #define ETW_WRITE_WSTRING_DATA_LENGTH (data_descriptor, data, data_len_bytes ) \
55+ EventDataDescCreate (data_descriptor, \
56+ data, \
57+ data_len_bytes);
58+
4559#define ETW_WRITE_NET_CONNECTION (descriptors, conn ) \
4660 ETW_WRITE_INT32_DATA (descriptors, &conn->fd); \
4761 ETW_WRITE_INT32_DATA (descriptors + 1 , &conn->port); \
@@ -61,6 +75,34 @@ extern int events_enabled;
6175 ETW_WRITE_INT32_DATA (descriptors, &type); \
6276 ETW_WRITE_INT32_DATA (descriptors + 1 , &flags);
6377
78+ #define ETW_WRITE_V8ADDRESSCHANGE (descriptors, addr1, addr2 ) \
79+ ETW_WRITE_ADDRESS_DATA (descriptors, &addr1); \
80+ ETW_WRITE_ADDRESS_DATA (descriptors + 1 , &addr2);
81+
82+ #define ETW_WRITE_JSMETHOD_LOADUNLOAD (descriptors, \
83+ context, \
84+ startAddr, \
85+ size, \
86+ id, \
87+ flags, \
88+ rangeId, \
89+ sourceId, \
90+ line, \
91+ col, \
92+ name, \
93+ name_len_bytes) \
94+ ETW_WRITE_ADDRESS_DATA (descriptors, &context); \
95+ ETW_WRITE_ADDRESS_DATA (descriptors + 1 , &startAddr); \
96+ ETW_WRITE_INT64_DATA (descriptors + 2 , &size); \
97+ ETW_WRITE_INT32_DATA (descriptors + 3 , &id); \
98+ ETW_WRITE_INT16_DATA (descriptors + 4 , &flags); \
99+ ETW_WRITE_INT16_DATA (descriptors + 5 , &rangeId); \
100+ ETW_WRITE_INT64_DATA (descriptors + 6 , &sourceId); \
101+ ETW_WRITE_INT32_DATA (descriptors + 7 , &line); \
102+ ETW_WRITE_INT32_DATA (descriptors + 8 , &col); \
103+ ETW_WRITE_WSTRING_DATA_LENGTH (descriptors + 9 , name, name_len_bytes);
104+
105+
64106#define ETW_WRITE_EVENT (eventDescriptor, dataDescriptors ) \
65107 DWORD status = event_write(node_provider, \
66108 &eventDescriptor, \
@@ -133,6 +175,83 @@ void NODE_GC_DONE(GCType type, GCCallbackFlags flags) {
133175}
134176
135177
178+ void NODE_V8SYMBOL_REMOVE (const void * addr1, const void * addr2) {
179+ if (events_enabled > 0 ) {
180+ EVENT_DATA_DESCRIPTOR descriptors[2 ];
181+ ETW_WRITE_V8ADDRESSCHANGE (descriptors, addr1, addr2);
182+ ETW_WRITE_EVENT (NODE_V8SYMBOL_REMOVE_EVENT, descriptors);
183+ }
184+ }
185+
186+
187+ void NODE_V8SYMBOL_MOVE (const void * addr1, const void * addr2) {
188+ if (events_enabled > 0 ) {
189+ EVENT_DATA_DESCRIPTOR descriptors[2 ];
190+ ETW_WRITE_V8ADDRESSCHANGE (descriptors, addr1, addr2);
191+ ETW_WRITE_EVENT (NODE_V8SYMBOL_MOVE_EVENT, descriptors);
192+ }
193+ }
194+
195+
196+ void NODE_V8SYMBOL_RESET () {
197+ if (events_enabled > 0 ) {
198+ int val = 0 ;
199+ EVENT_DATA_DESCRIPTOR descriptors[1 ];
200+ ETW_WRITE_INT32_DATA (descriptors, &val);
201+ ETW_WRITE_EVENT (NODE_V8SYMBOL_RESET_EVENT, descriptors);
202+ }
203+ }
204+
205+ #define SETSYMBUF (s ) \
206+ wcscpy (symbuf, s); \
207+ symbol_len = ARRAY_SIZE(s) - 1 ;
208+
209+ void NODE_V8SYMBOL_ADD (LPCSTR symbol,
210+ int symbol_len,
211+ const void * addr1,
212+ int len) {
213+ if (events_enabled > 0 ) {
214+ wchar_t symbuf[128 ];
215+ if (symbol == NULL ) {
216+ SETSYMBUF (L" NULL" );
217+ } else {
218+ symbol_len = MultiByteToWideChar (CP_ACP, 0 , symbol, symbol_len, symbuf, 128 );
219+ if (symbol_len == 0 ) {
220+ SETSYMBUF (L" Invalid" );
221+ } else {
222+ if (symbol_len > 127 ) {
223+ symbol_len = 127 ;
224+ }
225+ symbuf[symbol_len] = L' \0 ' ;
226+ }
227+ }
228+ void * context = NULL ;
229+ INT64 size = (INT64)len;
230+ INT32 id = (INT32)addr1;
231+ INT16 flags = 0 ;
232+ INT16 rangeid = 1 ;
233+ INT32 col = 1 ;
234+ INT32 line = 1 ;
235+ INT64 sourceid = 0 ;
236+ EVENT_DATA_DESCRIPTOR descriptors[10 ];
237+ ETW_WRITE_JSMETHOD_LOADUNLOAD (descriptors,
238+ context,
239+ addr1,
240+ size,
241+ id,
242+ flags,
243+ rangeid,
244+ sourceid,
245+ line,
246+ col,
247+ symbuf,
248+ symbol_len * sizeof (symbuf[0 ]));
249+ ETW_WRITE_EVENT (MethodLoad, descriptors);
250+ }
251+ }
252+ #undef SETSYMBUF
253+
254+
136255bool NODE_HTTP_SERVER_REQUEST_ENABLED () { return events_enabled > 0 ; }
137256bool NODE_HTTP_SERVER_RESPONSE_ENABLED () { return events_enabled > 0 ; }
138257bool NODE_HTTP_CLIENT_REQUEST_ENABLED () { return events_enabled > 0 ; }
@@ -141,5 +260,6 @@ bool NODE_NET_SERVER_CONNECTION_ENABLED() { return events_enabled > 0; }
141260bool NODE_NET_STREAM_END_ENABLED () { return events_enabled > 0 ; }
142261bool NODE_NET_SOCKET_READ_ENABLED () { return events_enabled > 0 ; }
143262bool NODE_NET_SOCKET_WRITE_ENABLED () { return events_enabled > 0 ; }
263+ bool NODE_V8SYMBOL_ENABLED () { return events_enabled > 0 ; }
144264}
145265#endif // SRC_ETW_INL_H_
0 commit comments