Fix profiling for shared libraries on Linux loaded at negative addresses
(Android does this). Fix logging for executable mappings that have no file associated. Be more consistent with use of uintptr_t. Review URL: http://codereview.chromium.org/125183 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2187 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
78a8cdfbe8
commit
52dfeca5f2
20
src/log.cc
20
src/log.cc
@ -426,26 +426,30 @@ void Logger::ApiNamedSecurityCheck(Object* key) {
|
||||
|
||||
|
||||
void Logger::SharedLibraryEvent(const char* library_path,
|
||||
unsigned start,
|
||||
unsigned end) {
|
||||
uintptr_t start,
|
||||
uintptr_t end) {
|
||||
#ifdef ENABLE_LOGGING_AND_PROFILING
|
||||
if (!Log::IsEnabled() || !FLAG_prof) return;
|
||||
LogMessageBuilder msg;
|
||||
msg.Append("shared-library,\"%s\",0x%08x,0x%08x\n", library_path,
|
||||
start, end);
|
||||
msg.Append("shared-library,\"%s\",0x%08" V8PRIxPTR ",0x%08" V8PRIxPTR "\n",
|
||||
library_path,
|
||||
start,
|
||||
end);
|
||||
msg.WriteToLogFile();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void Logger::SharedLibraryEvent(const wchar_t* library_path,
|
||||
unsigned start,
|
||||
unsigned end) {
|
||||
uintptr_t start,
|
||||
uintptr_t end) {
|
||||
#ifdef ENABLE_LOGGING_AND_PROFILING
|
||||
if (!Log::IsEnabled() || !FLAG_prof) return;
|
||||
LogMessageBuilder msg;
|
||||
msg.Append("shared-library,\"%ls\",0x%08x,0x%08x\n", library_path,
|
||||
start, end);
|
||||
msg.Append("shared-library,\"%ls\",0x%08" V8PRIxPTR ",0x%08" V8PRIxPTR "\n",
|
||||
library_path,
|
||||
start,
|
||||
end);
|
||||
msg.WriteToLogFile();
|
||||
#endif
|
||||
}
|
||||
|
@ -217,11 +217,11 @@ class Logger {
|
||||
static void HeapSampleItemEvent(const char* type, int number, int bytes);
|
||||
|
||||
static void SharedLibraryEvent(const char* library_path,
|
||||
unsigned start,
|
||||
unsigned end);
|
||||
uintptr_t start,
|
||||
uintptr_t end);
|
||||
static void SharedLibraryEvent(const wchar_t* library_path,
|
||||
unsigned start,
|
||||
unsigned end);
|
||||
uintptr_t start,
|
||||
uintptr_t end);
|
||||
|
||||
// ==== Events logged by --log-regexp ====
|
||||
// Regexp compilation and execution events.
|
||||
|
@ -224,8 +224,8 @@ PosixMemoryMappedFile::~PosixMemoryMappedFile() {
|
||||
|
||||
|
||||
#ifdef ENABLE_LOGGING_AND_PROFILING
|
||||
static unsigned StringToLong(char* buffer) {
|
||||
return static_cast<unsigned>(strtol(buffer, NULL, 16)); // NOLINT
|
||||
static uintptr_t StringToULong(char* buffer) {
|
||||
return strtoul(buffer, NULL, 16); // NOLINT
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -242,13 +242,13 @@ void OS::LogSharedLibraryAddresses() {
|
||||
addr_buffer[10] = 0;
|
||||
int result = read(fd, addr_buffer + 2, 8);
|
||||
if (result < 8) break;
|
||||
unsigned start = StringToLong(addr_buffer);
|
||||
uintptr_t start = StringToULong(addr_buffer);
|
||||
result = read(fd, addr_buffer + 2, 1);
|
||||
if (result < 1) break;
|
||||
if (addr_buffer[2] != '-') break;
|
||||
result = read(fd, addr_buffer + 2, 8);
|
||||
if (result < 8) break;
|
||||
unsigned end = StringToLong(addr_buffer);
|
||||
uintptr_t end = StringToULong(addr_buffer);
|
||||
char buffer[MAP_LENGTH];
|
||||
int bytes_read = -1;
|
||||
do {
|
||||
@ -262,10 +262,21 @@ void OS::LogSharedLibraryAddresses() {
|
||||
// Ignore mappings that are not executable.
|
||||
if (buffer[3] != 'x') continue;
|
||||
char* start_of_path = index(buffer, '/');
|
||||
// There may be no filename in this line. Skip to next.
|
||||
if (start_of_path == NULL) continue;
|
||||
buffer[bytes_read] = 0;
|
||||
LOG(SharedLibraryEvent(start_of_path, start, end));
|
||||
// If there is no filename for this line then log it as an anonymous
|
||||
// mapping and use the address as its name.
|
||||
if (start_of_path == NULL) {
|
||||
// 40 is enough to print a 64 bit address range.
|
||||
ASSERT(sizeof(buffer) > 40);
|
||||
snprintf(buffer,
|
||||
sizeof(buffer),
|
||||
"%08" V8PRIxPTR "-%08" V8PRIxPTR,
|
||||
start,
|
||||
end);
|
||||
LOG(SharedLibraryEvent(buffer, start, end));
|
||||
} else {
|
||||
buffer[bytes_read] = 0;
|
||||
LOG(SharedLibraryEvent(start_of_path, start, end));
|
||||
}
|
||||
}
|
||||
close(fd);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user