Commit 7e98cfa4 authored by jbates@chromium.org's avatar jbates@chromium.org

trace_event: distinguish between scoped begin/end and global start/finish events

BUG=100131

Review URL: http://codereview.chromium.org/8590015

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112722 0039d316-1c4b-4281-b951-d872f2087c98
parent 7d2c7f9f
This diff is collapsed.
This diff is collapsed.
...@@ -43,8 +43,12 @@ class TraceEventTestFixture : public testing::Test { ...@@ -43,8 +43,12 @@ class TraceEventTestFixture : public testing::Test {
void ManualTestSetUp(); void ManualTestSetUp();
void OnTraceDataCollected( void OnTraceDataCollected(
scoped_refptr<TraceLog::RefCountedString> events_str); scoped_refptr<TraceLog::RefCountedString> events_str);
bool FindMatchingTraceEntry(const JsonKeyValue* key_values); DictionaryValue* FindMatchingTraceEntry(const JsonKeyValue* key_values);
bool FindNamePhase(const char* name, const char* phase); DictionaryValue* FindNamePhase(const char* name, const char* phase);
DictionaryValue* FindNamePhaseKeyValue(const char* name,
const char* phase,
const char* key,
const char* value);
bool FindMatchingValue(const char* key, bool FindMatchingValue(const char* key,
const char* value); const char* value);
bool FindNonMatchingValue(const char* key, bool FindNonMatchingValue(const char* key,
...@@ -150,7 +154,7 @@ static bool IsAllKeyValueInDict(const JsonKeyValue* key_values, ...@@ -150,7 +154,7 @@ static bool IsAllKeyValueInDict(const JsonKeyValue* key_values,
return true; return true;
} }
bool TraceEventTestFixture::FindMatchingTraceEntry( DictionaryValue* TraceEventTestFixture::FindMatchingTraceEntry(
const JsonKeyValue* key_values) { const JsonKeyValue* key_values) {
// Scan all items // Scan all items
size_t trace_parsed_count = trace_parsed_.GetSize(); size_t trace_parsed_count = trace_parsed_.GetSize();
...@@ -162,12 +166,13 @@ bool TraceEventTestFixture::FindMatchingTraceEntry( ...@@ -162,12 +166,13 @@ bool TraceEventTestFixture::FindMatchingTraceEntry(
DictionaryValue* dict = static_cast<DictionaryValue*>(value); DictionaryValue* dict = static_cast<DictionaryValue*>(value);
if (IsAllKeyValueInDict(key_values, dict)) if (IsAllKeyValueInDict(key_values, dict))
return true; return dict;
} }
return false; return NULL;
} }
bool TraceEventTestFixture::FindNamePhase(const char* name, const char* phase) { DictionaryValue* TraceEventTestFixture::FindNamePhase(const char* name,
const char* phase) {
JsonKeyValue key_values[] = { JsonKeyValue key_values[] = {
{"name", name, IS_EQUAL}, {"name", name, IS_EQUAL},
{"ph", phase, IS_EQUAL}, {"ph", phase, IS_EQUAL},
...@@ -176,6 +181,20 @@ bool TraceEventTestFixture::FindNamePhase(const char* name, const char* phase) { ...@@ -176,6 +181,20 @@ bool TraceEventTestFixture::FindNamePhase(const char* name, const char* phase) {
return FindMatchingTraceEntry(key_values); return FindMatchingTraceEntry(key_values);
} }
DictionaryValue* TraceEventTestFixture::FindNamePhaseKeyValue(
const char* name,
const char* phase,
const char* key,
const char* value) {
JsonKeyValue key_values[] = {
{"name", name, IS_EQUAL},
{"ph", phase, IS_EQUAL},
{key, value, IS_EQUAL},
{0, 0, IS_EQUAL}
};
return FindMatchingTraceEntry(key_values);
}
bool TraceEventTestFixture::FindMatchingValue(const char* key, bool TraceEventTestFixture::FindMatchingValue(const char* key,
const char* value) { const char* value) {
JsonKeyValue key_values[] = { JsonKeyValue key_values[] = {
...@@ -262,10 +281,10 @@ std::vector<DictionaryValue*> FindTraceEntries( ...@@ -262,10 +281,10 @@ std::vector<DictionaryValue*> FindTraceEntries(
void TraceWithAllMacroVariants(WaitableEvent* task_complete_event) { void TraceWithAllMacroVariants(WaitableEvent* task_complete_event) {
{ {
TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW call", 1122, "extrastring1"); TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW call", 0x1122, "extrastring1");
TRACE_EVENT_END_ETW("TRACE_EVENT_END_ETW call", 3344, "extrastring2"); TRACE_EVENT_END_ETW("TRACE_EVENT_END_ETW call", 0x3344, "extrastring2");
TRACE_EVENT_INSTANT_ETW("TRACE_EVENT_INSTANT_ETW call", TRACE_EVENT_INSTANT_ETW("TRACE_EVENT_INSTANT_ETW call",
5566, "extrastring3"); 0x5566, "extrastring3");
TRACE_EVENT0("all", "TRACE_EVENT0 call"); TRACE_EVENT0("all", "TRACE_EVENT0 call");
TRACE_EVENT1("all", "TRACE_EVENT1 call", "name1", "value1"); TRACE_EVENT1("all", "TRACE_EVENT1 call", "name1", "value1");
...@@ -315,9 +334,9 @@ void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) { ...@@ -315,9 +334,9 @@ void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) {
EXPECT_FIND_("all"); EXPECT_FIND_("all");
EXPECT_FIND_("TRACE_EVENT_BEGIN_ETW call"); EXPECT_FIND_("TRACE_EVENT_BEGIN_ETW call");
{ {
int int_val = 0; std::string str_val;
EXPECT_TRUE(item && item->GetInteger("args.id", &int_val)); EXPECT_TRUE(item && item->GetString("args.id", &str_val));
EXPECT_EQ(1122, int_val); EXPECT_STREQ("1122", str_val.c_str());
} }
EXPECT_SUB_FIND_("extrastring1"); EXPECT_SUB_FIND_("extrastring1");
EXPECT_FIND_("TRACE_EVENT_END_ETW call"); EXPECT_FIND_("TRACE_EVENT_END_ETW call");
...@@ -664,6 +683,72 @@ TEST_F(TraceEventTestFixture, DataCapturedThreshold) { ...@@ -664,6 +683,72 @@ TEST_F(TraceEventTestFixture, DataCapturedThreshold) {
EXPECT_NOT_FIND_BE_("4thresholdlong2"); EXPECT_NOT_FIND_BE_("4thresholdlong2");
} }
// Test Start/Finish events
TEST_F(TraceEventTestFixture, StartFinishEvents) {
ManualTestSetUp();
TraceLog::GetInstance()->SetEnabled(true);
unsigned long long id = 0xfeedbeeffeedbeefull;
TRACE_EVENT_START0( "cat", "name1", id);
TRACE_EVENT_FINISH0("cat", "name1", id);
TRACE_EVENT_BEGIN0( "cat", "name2");
TRACE_EVENT_START0( "cat", "name3", 0);
TraceLog::GetInstance()->SetEnabled(false);
EXPECT_TRUE(FindNamePhase("name1", "S"));
EXPECT_TRUE(FindNamePhase("name1", "F"));
std::string id_str;
StringAppendF(&id_str, "%llx", id);
EXPECT_TRUE(FindNamePhaseKeyValue("name1", "S", "id", id_str.c_str()));
EXPECT_TRUE(FindNamePhaseKeyValue("name1", "F", "id", id_str.c_str()));
EXPECT_TRUE(FindNamePhaseKeyValue("name3", "S", "id", "0"));
// BEGIN events should not have id
EXPECT_FALSE(FindNamePhaseKeyValue("name2", "B", "id", "0"));
}
// Test Start/Finish events
TEST_F(TraceEventTestFixture, StartFinishPointerMangling) {
ManualTestSetUp();
void* ptr = this;
TraceLog::GetInstance()->SetProcessID(100);
TraceLog::GetInstance()->SetEnabled(true);
TRACE_EVENT_START0( "cat", "name1", ptr);
TRACE_EVENT_START0( "cat", "name2", ptr);
TraceLog::GetInstance()->SetEnabled(false);
TraceLog::GetInstance()->SetProcessID(200);
TraceLog::GetInstance()->SetEnabled(true);
TRACE_EVENT_FINISH0( "cat", "name1", ptr);
TraceLog::GetInstance()->SetEnabled(false);
DictionaryValue* start = FindNamePhase("name1", "S");
DictionaryValue* start2 = FindNamePhase("name2", "S");
DictionaryValue* finish = FindNamePhase("name1", "F");
EXPECT_TRUE(start);
EXPECT_TRUE(start2);
EXPECT_TRUE(finish);
Value* value = NULL;
std::string start_id_str;
std::string start2_id_str;
std::string finish_id_str;
ASSERT_TRUE(start->Get("id", &value));
ASSERT_TRUE(value->GetAsString(&start_id_str));
ASSERT_TRUE(start2->Get("id", &value));
ASSERT_TRUE(value->GetAsString(&start2_id_str));
ASSERT_TRUE(finish->Get("id", &value));
ASSERT_TRUE(value->GetAsString(&finish_id_str));
EXPECT_STREQ(start_id_str.c_str(), start2_id_str.c_str());
EXPECT_STRNE(start_id_str.c_str(), finish_id_str.c_str());
}
// Test that static strings are not copied. // Test that static strings are not copied.
TEST_F(TraceEventTestFixture, StaticStringVsString) { TEST_F(TraceEventTestFixture, StaticStringVsString) {
ManualTestSetUp(); ManualTestSetUp();
......
...@@ -107,7 +107,7 @@ const base::win::EtwEventType kTraceEventTypeEnd = 0x11; ...@@ -107,7 +107,7 @@ const base::win::EtwEventType kTraceEventTypeEnd = 0x11;
const base::win::EtwEventType kTraceEventTypeInstant = 0x12; const base::win::EtwEventType kTraceEventTypeInstant = 0x12;
// If this flag is set in enable flags // If this flag is set in enable flags
enum TraceEventFlags { enum TraceEventETWFlags {
CAPTURE_STACK_TRACE = 0x0001, CAPTURE_STACK_TRACE = 0x0001,
}; };
......
...@@ -216,7 +216,7 @@ TEST_F(TraceEventWinTest, TraceLog) { ...@@ -216,7 +216,7 @@ TEST_F(TraceEventWinTest, TraceLog) {
// Full argument version, passing lengths explicitly. // Full argument version, passing lengths explicitly.
TraceEventETWProvider::Trace(kName, TraceEventETWProvider::Trace(kName,
strlen(kName), strlen(kName),
base::debug::TRACE_EVENT_PHASE_BEGIN, TRACE_EVENT_PHASE_BEGIN,
kId, kId,
kExtra, kExtra,
strlen(kExtra)); strlen(kExtra));
...@@ -229,7 +229,7 @@ TEST_F(TraceEventWinTest, TraceLog) { ...@@ -229,7 +229,7 @@ TEST_F(TraceEventWinTest, TraceLog) {
// Const char* version. // Const char* version.
TraceEventETWProvider::Trace(static_cast<const char*>(kName), TraceEventETWProvider::Trace(static_cast<const char*>(kName),
base::debug::TRACE_EVENT_PHASE_END, TRACE_EVENT_PHASE_END,
kId, kId,
static_cast<const char*>(kExtra)); static_cast<const char*>(kExtra));
...@@ -241,7 +241,7 @@ TEST_F(TraceEventWinTest, TraceLog) { ...@@ -241,7 +241,7 @@ TEST_F(TraceEventWinTest, TraceLog) {
// std::string extra version. // std::string extra version.
TraceEventETWProvider::Trace(static_cast<const char*>(kName), TraceEventETWProvider::Trace(static_cast<const char*>(kName),
base::debug::TRACE_EVENT_PHASE_INSTANT, TRACE_EVENT_PHASE_INSTANT,
kId, kId,
std::string(kExtra)); std::string(kExtra));
...@@ -255,7 +255,7 @@ TEST_F(TraceEventWinTest, TraceLog) { ...@@ -255,7 +255,7 @@ TEST_F(TraceEventWinTest, TraceLog) {
// Test for sanity on NULL inputs. // Test for sanity on NULL inputs.
TraceEventETWProvider::Trace(NULL, TraceEventETWProvider::Trace(NULL,
0, 0,
base::debug::TRACE_EVENT_PHASE_BEGIN, TRACE_EVENT_PHASE_BEGIN,
kId, kId,
NULL, NULL,
0); 0);
...@@ -268,7 +268,7 @@ TEST_F(TraceEventWinTest, TraceLog) { ...@@ -268,7 +268,7 @@ TEST_F(TraceEventWinTest, TraceLog) {
TraceEventETWProvider::Trace(NULL, TraceEventETWProvider::Trace(NULL,
-1, -1,
base::debug::TRACE_EVENT_PHASE_END, TRACE_EVENT_PHASE_END,
kId, kId,
NULL, NULL,
-1); -1);
......
...@@ -18,7 +18,7 @@ namespace trace_analyzer { ...@@ -18,7 +18,7 @@ namespace trace_analyzer {
TraceEvent::TraceEvent() TraceEvent::TraceEvent()
: thread(0, 0), : thread(0, 0),
timestamp(0), timestamp(0),
phase(base::debug::TRACE_EVENT_PHASE_BEGIN), phase(TRACE_EVENT_PHASE_BEGIN),
other_event(NULL) { other_event(NULL) {
} }
...@@ -642,9 +642,9 @@ void TraceAnalyzer::AssociateBeginEndEvents() { ...@@ -642,9 +642,9 @@ void TraceAnalyzer::AssociateBeginEndEvents() {
using namespace trace_analyzer; using namespace trace_analyzer;
Query begin(Query(EVENT_PHASE) == Query begin(Query(EVENT_PHASE) ==
Query::Phase(base::debug::TRACE_EVENT_PHASE_BEGIN)); Query::Phase(TRACE_EVENT_PHASE_BEGIN));
Query end(Query(EVENT_PHASE) == Query end(Query(EVENT_PHASE) ==
Query::Phase(base::debug::TRACE_EVENT_PHASE_END)); Query::Phase(TRACE_EVENT_PHASE_END));
Query match(Query(EVENT_NAME) == Query(OTHER_NAME) && Query match(Query(EVENT_NAME) == Query(OTHER_NAME) &&
Query(EVENT_CATEGORY) == Query(OTHER_CATEGORY) && Query(EVENT_CATEGORY) == Query(OTHER_CATEGORY) &&
Query(EVENT_TID) == Query(OTHER_TID) && Query(EVENT_TID) == Query(OTHER_TID) &&
...@@ -752,7 +752,7 @@ void TraceAnalyzer::ParseMetadata() { ...@@ -752,7 +752,7 @@ void TraceAnalyzer::ParseMetadata() {
for (size_t i = 0; i < raw_events_.size(); ++i) { for (size_t i = 0; i < raw_events_.size(); ++i) {
TraceEvent& this_event = raw_events_[i]; TraceEvent& this_event = raw_events_[i];
// Check for thread name metadata. // Check for thread name metadata.
if (this_event.phase != base::debug::TRACE_EVENT_PHASE_METADATA || if (this_event.phase != TRACE_EVENT_PHASE_METADATA ||
this_event.name != "thread_name") this_event.name != "thread_name")
continue; continue;
std::map<std::string, std::string>::const_iterator string_it = std::map<std::string, std::string>::const_iterator string_it =
......
...@@ -253,7 +253,7 @@ class Query { ...@@ -253,7 +253,7 @@ class Query {
// Find BEGIN events that have a corresponding END event. // Find BEGIN events that have a corresponding END event.
static Query MatchBeginWithEnd() { static Query MatchBeginWithEnd() {
return (Query(EVENT_PHASE) == return (Query(EVENT_PHASE) ==
Query::Phase(base::debug::TRACE_EVENT_PHASE_BEGIN)) && Query::Phase(TRACE_EVENT_PHASE_BEGIN)) &&
Query(EVENT_HAS_OTHER); Query(EVENT_HAS_OTHER);
} }
......
...@@ -108,7 +108,7 @@ TEST_F(TraceEventAnalyzerTest, QueryEventMember) { ...@@ -108,7 +108,7 @@ TEST_F(TraceEventAnalyzerTest, QueryEventMember) {
event.thread.process_id = 3; event.thread.process_id = 3;
event.thread.thread_id = 4; event.thread.thread_id = 4;
event.timestamp = 1.5; event.timestamp = 1.5;
event.phase = base::debug::TRACE_EVENT_PHASE_BEGIN; event.phase = TRACE_EVENT_PHASE_BEGIN;
event.category = "category"; event.category = "category";
event.name = "name"; event.name = "name";
event.arg_numbers["num"] = 7.0; event.arg_numbers["num"] = 7.0;
...@@ -119,7 +119,7 @@ TEST_F(TraceEventAnalyzerTest, QueryEventMember) { ...@@ -119,7 +119,7 @@ TEST_F(TraceEventAnalyzerTest, QueryEventMember) {
other.thread.process_id = 5; other.thread.process_id = 5;
other.thread.thread_id = 6; other.thread.thread_id = 6;
other.timestamp = 2.5; other.timestamp = 2.5;
other.phase = base::debug::TRACE_EVENT_PHASE_END; other.phase = TRACE_EVENT_PHASE_END;
other.category = "category2"; other.category = "category2";
other.name = "name2"; other.name = "name2";
other.arg_numbers["num2"] = 8.0; other.arg_numbers["num2"] = 8.0;
......
[
{"cat":"r","pid":1,"tid":1,"ts":50,"ph":"S","name":"A","args":{},"id":"1a"},
{"cat":"r","pid":1,"tid":1,"ts":100,"ph":"S","name":"B","args":{},"id":"1"},
{"cat":"r","pid":1,"tid":1,"ts":120,"ph":"B","name":"BE1","args":{}},
{"cat":"r","pid":1,"tid":1,"ts":150,"ph":"F","name":"D","args":{},"id":"bf1"},
{"cat":"r","pid":1,"tid":1,"ts":170,"ph":"E","name":"BE1","args":{}},
{"cat":"r","pid":1,"tid":1,"ts":200,"ph":"S","name":"B","args":{},"id":"2"},
{"cat":"r","pid":1,"tid":1,"ts":220,"ph":"B","name":"BE1","args":{}},
{"cat":"r","pid":1,"tid":1,"ts":230,"ph":"B","name":"BE2","args":{}},
{"cat":"r","pid":1,"tid":1,"ts":250,"ph":"S","name":"A","args":{},"id":"2a"},
{"cat":"r","pid":1,"tid":1,"ts":270,"ph":"E","name":"BE2","args":{}},
{"cat":"r","pid":1,"tid":1,"ts":300,"ph":"F","name":"B","args":{},"id":"1"},
{"cat":"r","pid":1,"tid":1,"ts":350,"ph":"E","name":"BE1","args":{}},
{"cat":"r","pid":1,"tid":1,"ts":400,"ph":"F","name":"B","args":{},"id":"2"},
{"cat":"r","pid":2,"tid":2,"ts":500,"ph":"S","name":"E","args":{},"id":"1"},
{"cat":"r","pid":2,"tid":3,"ts":600,"ph":"S","name":"E","args":{},"id":"2"},
{"cat":"r","pid":3,"tid":4,"ts":700,"ph":"F","name":"E","args":{},"id":"1"},
{"cat":"r","pid":1,"tid":1,"ts":725,"ph":"S","name":"D","args":{},"id":"bf2"},
{"cat":"r","pid":1,"tid":1,"ts":750,"ph":"F","name":"A","args":{},"id":"2a"},
{"cat":"r","pid":3,"tid":5,"ts":800,"ph":"F","name":"E","args":{},"id":"2"},
{"cat":"r","pid":1,"tid":1,"ts":900,"ph":"F","name":"A","args":{},"id":"1a"}
]
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment