OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Use trace_analyzer::Query and trace_analyzer::TraceAnalyzer to search for | 5 // Use trace_analyzer::Query and trace_analyzer::TraceAnalyzer to search for |
6 // specific trace events that were generated by the trace_event.h API. | 6 // specific trace events that were generated by the trace_event.h API. |
7 // | 7 // |
8 // Basic procedure: | 8 // Basic procedure: |
9 // - Get trace events JSON string from base::trace_event::TraceLog. | 9 // - Get trace events JSON string from base::trace_event::TraceLog. |
10 // - Create TraceAnalyzer with JSON string. | 10 // - Create TraceAnalyzer with JSON string. |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 std::string id; | 167 std::string id; |
168 | 168 |
169 // All numbers and bool values from TraceEvent args are cast to double. | 169 // All numbers and bool values from TraceEvent args are cast to double. |
170 // bool becomes 1.0 (true) or 0.0 (false). | 170 // bool becomes 1.0 (true) or 0.0 (false). |
171 std::map<std::string, double> arg_numbers; | 171 std::map<std::string, double> arg_numbers; |
172 std::map<std::string, std::string> arg_strings; | 172 std::map<std::string, std::string> arg_strings; |
173 std::map<std::string, std::unique_ptr<base::Value>> arg_values; | 173 std::map<std::string, std::unique_ptr<base::Value>> arg_values; |
174 | 174 |
175 // The other event associated with this event (or NULL). | 175 // The other event associated with this event (or NULL). |
176 const TraceEvent* other_event; | 176 const TraceEvent* other_event; |
| 177 |
| 178 // A back-link for |other_event|. That is, if other_event is not null, then |
| 179 // |event->other_event->prev_event == event| is always true. |
| 180 const TraceEvent* prev_event; |
177 }; | 181 }; |
178 | 182 |
179 typedef std::vector<const TraceEvent*> TraceEventVector; | 183 typedef std::vector<const TraceEvent*> TraceEventVector; |
180 | 184 |
181 class Query { | 185 class Query { |
182 public: | 186 public: |
183 Query(const Query& query); | 187 Query(const Query& query); |
184 | 188 |
185 ~Query(); | 189 ~Query(); |
186 | 190 |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 // Number arguments include types double, int and bool. | 348 // Number arguments include types double, int and bool. |
345 static Query OtherHasNumberArg(const std::string& arg_name) { | 349 static Query OtherHasNumberArg(const std::string& arg_name) { |
346 return Query(OTHER_HAS_NUMBER_ARG, arg_name); | 350 return Query(OTHER_HAS_NUMBER_ARG, arg_name); |
347 } | 351 } |
348 | 352 |
349 // Evaluates to arg value (string or number). | 353 // Evaluates to arg value (string or number). |
350 static Query OtherArg(const std::string& arg_name) { | 354 static Query OtherArg(const std::string& arg_name) { |
351 return Query(OTHER_ARG, arg_name); | 355 return Query(OTHER_ARG, arg_name); |
352 } | 356 } |
353 | 357 |
| 358 // Access the associated prev_event's members: |
| 359 |
| 360 static Query PrevPid() { return Query(PREV_PID); } |
| 361 |
| 362 static Query PrevTid() { return Query(PREV_TID); } |
| 363 |
| 364 static Query PrevTime() { return Query(PREV_TIME); } |
| 365 |
| 366 static Query PrevPhase() { return Query(PREV_PHASE); } |
| 367 |
| 368 static Query PrevCategory() { return Query(PREV_CATEGORY); } |
| 369 |
| 370 static Query PrevName() { return Query(PREV_NAME); } |
| 371 |
| 372 static Query PrevId() { return Query(PREV_ID); } |
| 373 |
| 374 static Query PrevPidIs(int process_id) { |
| 375 return Query(PREV_PID) == Query::Int(process_id); |
| 376 } |
| 377 |
| 378 static Query PrevTidIs(int thread_id) { |
| 379 return Query(PREV_TID) == Query::Int(thread_id); |
| 380 } |
| 381 |
| 382 static Query PrevThreadIs(const TraceEvent::ProcessThreadID& thread) { |
| 383 return PrevPidIs(thread.process_id) && PrevTidIs(thread.thread_id); |
| 384 } |
| 385 |
| 386 static Query PrevTimeIs(double timestamp) { |
| 387 return Query(PREV_TIME) == Query::Double(timestamp); |
| 388 } |
| 389 |
| 390 static Query PrevPhaseIs(char phase) { |
| 391 return Query(PREV_PHASE) == Query::Phase(phase); |
| 392 } |
| 393 |
| 394 static Query PrevCategoryIs(const std::string& category) { |
| 395 return Query(PREV_CATEGORY) == Query::String(category); |
| 396 } |
| 397 |
| 398 static Query PrevNameIs(const std::string& name) { |
| 399 return Query(PREV_NAME) == Query::String(name); |
| 400 } |
| 401 |
| 402 static Query PrevIdIs(const std::string& id) { |
| 403 return Query(PREV_ID) == Query::String(id); |
| 404 } |
| 405 |
| 406 // Evaluates to true if arg exists and is a string. |
| 407 static Query PrevHasStringArg(const std::string& arg_name) { |
| 408 return Query(PREV_HAS_STRING_ARG, arg_name); |
| 409 } |
| 410 |
| 411 // Evaluates to true if arg exists and is a number. |
| 412 // Number arguments include types double, int and bool. |
| 413 static Query PrevHasNumberArg(const std::string& arg_name) { |
| 414 return Query(PREV_HAS_NUMBER_ARG, arg_name); |
| 415 } |
| 416 |
| 417 // Evaluates to arg value (string or number). |
| 418 static Query PrevArg(const std::string& arg_name) { |
| 419 return Query(PREV_ARG, arg_name); |
| 420 } |
| 421 |
354 //////////////////////////////////////////////////////////////// | 422 //////////////////////////////////////////////////////////////// |
355 // Common queries: | 423 // Common queries: |
356 | 424 |
357 // Find BEGIN events that have a corresponding END event. | 425 // Find BEGIN events that have a corresponding END event. |
358 static Query MatchBeginWithEnd() { | 426 static Query MatchBeginWithEnd() { |
359 return (Query(EVENT_PHASE) == Query::Phase(TRACE_EVENT_PHASE_BEGIN)) && | 427 return (Query(EVENT_PHASE) == Query::Phase(TRACE_EVENT_PHASE_BEGIN)) && |
360 Query(EVENT_HAS_OTHER); | 428 Query(EVENT_HAS_OTHER); |
361 } | 429 } |
362 | 430 |
363 // Find COMPLETE events. | 431 // Find COMPLETE events. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 EVENT_DURATION, | 499 EVENT_DURATION, |
432 EVENT_COMPLETE_DURATION, | 500 EVENT_COMPLETE_DURATION, |
433 EVENT_PHASE, | 501 EVENT_PHASE, |
434 EVENT_CATEGORY, | 502 EVENT_CATEGORY, |
435 EVENT_NAME, | 503 EVENT_NAME, |
436 EVENT_ID, | 504 EVENT_ID, |
437 EVENT_HAS_STRING_ARG, | 505 EVENT_HAS_STRING_ARG, |
438 EVENT_HAS_NUMBER_ARG, | 506 EVENT_HAS_NUMBER_ARG, |
439 EVENT_ARG, | 507 EVENT_ARG, |
440 EVENT_HAS_OTHER, | 508 EVENT_HAS_OTHER, |
| 509 EVENT_HAS_PREV, |
| 510 |
441 OTHER_PID, | 511 OTHER_PID, |
442 OTHER_TID, | 512 OTHER_TID, |
443 OTHER_TIME, | 513 OTHER_TIME, |
444 OTHER_PHASE, | 514 OTHER_PHASE, |
445 OTHER_CATEGORY, | 515 OTHER_CATEGORY, |
446 OTHER_NAME, | 516 OTHER_NAME, |
447 OTHER_ID, | 517 OTHER_ID, |
448 OTHER_HAS_STRING_ARG, | 518 OTHER_HAS_STRING_ARG, |
449 OTHER_HAS_NUMBER_ARG, | 519 OTHER_HAS_NUMBER_ARG, |
450 OTHER_ARG, | 520 OTHER_ARG, |
| 521 |
| 522 PREV_PID, |
| 523 PREV_TID, |
| 524 PREV_TIME, |
| 525 PREV_PHASE, |
| 526 PREV_CATEGORY, |
| 527 PREV_NAME, |
| 528 PREV_ID, |
| 529 PREV_HAS_STRING_ARG, |
| 530 PREV_HAS_NUMBER_ARG, |
| 531 PREV_ARG, |
| 532 |
| 533 OTHER_FIRST_MEMBER = OTHER_PID, |
| 534 OTHER_LAST_MEMBER = OTHER_ARG, |
| 535 |
| 536 PREV_FIRST_MEMBER = PREV_PID, |
| 537 PREV_LAST_MEMBER = PREV_ARG, |
451 }; | 538 }; |
452 | 539 |
453 enum Operator { | 540 enum Operator { |
454 OP_INVALID, | 541 OP_INVALID, |
455 // Boolean operators: | 542 // Boolean operators: |
456 OP_EQ, | 543 OP_EQ, |
457 OP_NE, | 544 OP_NE, |
458 OP_LT, | 545 OP_LT, |
459 OP_LE, | 546 OP_LE, |
460 OP_GT, | 547 OP_GT, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 bool is_value() const { return type_ != QUERY_BOOLEAN_OPERATOR; } | 616 bool is_value() const { return type_ != QUERY_BOOLEAN_OPERATOR; } |
530 | 617 |
531 bool is_unary_operator() const { | 618 bool is_unary_operator() const { |
532 return operator_ == OP_NOT || operator_ == OP_NEGATE; | 619 return operator_ == OP_NOT || operator_ == OP_NEGATE; |
533 } | 620 } |
534 | 621 |
535 bool is_comparison_operator() const { | 622 bool is_comparison_operator() const { |
536 return operator_ != OP_INVALID && operator_ < OP_AND; | 623 return operator_ != OP_INVALID && operator_ < OP_AND; |
537 } | 624 } |
538 | 625 |
| 626 static const TraceEvent* SelectTargetEvent(const TraceEvent* ev, |
| 627 TraceEventMember member); |
| 628 |
539 const Query& left() const; | 629 const Query& left() const; |
540 const Query& right() const; | 630 const Query& right() const; |
541 | 631 |
542 QueryType type_; | 632 QueryType type_; |
543 Operator operator_; | 633 Operator operator_; |
544 scoped_refptr<QueryNode> left_; | 634 scoped_refptr<QueryNode> left_; |
545 scoped_refptr<QueryNode> right_; | 635 scoped_refptr<QueryNode> right_; |
546 TraceEventMember member_; | 636 TraceEventMember member_; |
547 double number_; | 637 double number_; |
548 std::string string_; | 638 std::string string_; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 // An end event will match the most recent begin event with the same name, | 672 // An end event will match the most recent begin event with the same name, |
583 // category, process ID and thread ID. This matches what is shown in | 673 // category, process ID and thread ID. This matches what is shown in |
584 // about:tracing. After association, the BEGIN event will point to the | 674 // about:tracing. After association, the BEGIN event will point to the |
585 // matching END event, but the END event will not point to the BEGIN event. | 675 // matching END event, but the END event will not point to the BEGIN event. |
586 void AssociateBeginEndEvents(); | 676 void AssociateBeginEndEvents(); |
587 | 677 |
588 // Associate ASYNC_BEGIN, ASYNC_STEP and ASYNC_END events with each other. | 678 // Associate ASYNC_BEGIN, ASYNC_STEP and ASYNC_END events with each other. |
589 // An ASYNC_END event will match the most recent ASYNC_BEGIN or ASYNC_STEP | 679 // An ASYNC_END event will match the most recent ASYNC_BEGIN or ASYNC_STEP |
590 // event with the same name, category, and ID. This creates a singly linked | 680 // event with the same name, category, and ID. This creates a singly linked |
591 // list of ASYNC_BEGIN->ASYNC_STEP...->ASYNC_END. | 681 // list of ASYNC_BEGIN->ASYNC_STEP...->ASYNC_END. |
592 void AssociateAsyncBeginEndEvents(); | 682 // |match_pid| - If true, will only match async events which are running |
| 683 // under the same process ID, otherwise will allow linking |
| 684 // async events from different processes. |
| 685 void AssociateAsyncBeginEndEvents(bool match_pid = true); |
593 | 686 |
594 // AssociateEvents can be used to customize event associations by setting the | 687 // AssociateEvents can be used to customize event associations by setting the |
595 // other_event member of TraceEvent. This should be used to associate two | 688 // other_event member of TraceEvent. This should be used to associate two |
596 // INSTANT events. | 689 // INSTANT events. |
597 // | 690 // |
598 // The assumptions are: | 691 // The assumptions are: |
599 // - |first| events occur before |second| events. | 692 // - |first| events occur before |second| events. |
600 // - the closest matching |second| event is the correct match. | 693 // - the closest matching |second| event is the correct match. |
601 // | 694 // |
602 // |first| - Eligible |first| events match this query. | 695 // |first| - Eligible |first| events match this query. |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 | 801 |
709 // Count all matches. | 802 // Count all matches. |
710 static inline size_t CountMatches(const TraceEventVector& events, | 803 static inline size_t CountMatches(const TraceEventVector& events, |
711 const Query& query) { | 804 const Query& query) { |
712 return CountMatches(events, query, 0u, events.size()); | 805 return CountMatches(events, query, 0u, events.size()); |
713 } | 806 } |
714 | 807 |
715 } // namespace trace_analyzer | 808 } // namespace trace_analyzer |
716 | 809 |
717 #endif // BASE_TEST_TRACE_EVENT_ANALYZER_H_ | 810 #endif // BASE_TEST_TRACE_EVENT_ANALYZER_H_ |
OLD | NEW |