summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorguanglei <guanglei>2006-11-19 07:22:47 +0000
committerguanglei <guanglei>2006-11-19 07:22:47 +0000
commitfbec2ab76beb52878de6bb275ed1ed8d8f819c34 (patch)
tree29bb4ccd6bb1cef00ddf74aa5cb80727ef63c7d6 /runtime
parent9f36b77f43db9975865f01f5bda68a824d24fcfb (diff)
downloadsystemtap-steved-fbec2ab76beb52878de6bb275ed1ed8d8f819c34.tar.gz
systemtap-steved-fbec2ab76beb52878de6bb275ed1ed8d8f819c34.tar.xz
systemtap-steved-fbec2ab76beb52878de6bb275ed1ed8d8f819c34.zip
bugfix for #3526:
runtime/lket/b2a/lket_b2a.[ch]: bugfix for #3536 lket_trace.stp: add the logging of pid, ppid process.stp: add logging of tid, ppid for lket_internal.process.execve. Change to use for_each_process() in process_snapshot() to get the info of all running processes. register_event.stp: update the registering codes of execve event.
Diffstat (limited to 'runtime')
-rw-r--r--runtime/ChangeLog3
-rw-r--r--runtime/lket/b2a/lket_b2a.c112
-rw-r--r--runtime/lket/b2a/lket_b2a.h8
3 files changed, 58 insertions, 65 deletions
diff --git a/runtime/ChangeLog b/runtime/ChangeLog
index d15343e9..3929e46f 100644
--- a/runtime/ChangeLog
+++ b/runtime/ChangeLog
@@ -1,3 +1,6 @@
+2006-11-19 Li Guanglei <guanglei@cn.ibm.com>
+ * runtime/lket/b2a/lket_b2a.[ch]: bugfix for #3536
+
2006-11-15 Martin Hunt <hunt@redhat.com>
* alloc.c (STP_ALLOC_FLAGS): Define.
diff --git a/runtime/lket/b2a/lket_b2a.c b/runtime/lket/b2a/lket_b2a.c
index 1b19a672..20badc62 100644
--- a/runtime/lket/b2a/lket_b2a.c
+++ b/runtime/lket/b2a/lket_b2a.c
@@ -264,7 +264,8 @@ int main(int argc, char *argv[])
if(HDR_GroupID(&hdrs[j])==_GROUP_PROCESS &&
(HDR_HookID(&hdrs[j])==_HOOKID_PROCESS_SNAPSHOT
- || HDR_HookID(&hdrs[j])==_HOOKID_PROCESS_EXECVE))
+ || HDR_HookID(&hdrs[j])==_HOOKID_PROCESS_EXECVE
+ || HDR_HookID(&hdrs[j])==_HOOKID_PROCESS_FORK))
{
register_appname(j, infps[j], &hdrs[j]);
}
@@ -360,7 +361,7 @@ failed:
and addevent.process.execve */
void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
{
- int pid;
+ int pid, tid, ppid;
char *appname=NULL;
int count;
int len;
@@ -374,8 +375,7 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
if(into_db) {
if(flag==0) {
- if(mysql_query(&mysql, "create table appNameMap ( \
- pid INT, pname varchar(20))")) {
+ if(mysql_query(&mysql, "create table appNameMap ( pid INT, pname varchar(20))")) {
fprintf(stderr, "Failed to create appNameMap table, Error: %s\n",
mysql_error(&mysql));
exit(-1);
@@ -388,9 +388,9 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
location = ftell(fp);
if(HDR_HookID(phdr) == _HOOKID_PROCESS_SNAPSHOT ) { /* process_snapshot */
- fseek(fp, 4, SEEK_CUR); /* skip tid */
+ fread(&tid, 1, 4, fp); /* read tid */
fread(&pid, 1, 4, fp); /* read pid */
- fseek(fp, 4, SEEK_CUR); /* skip ppid */
+ fread(&ppid, 1, 4, fp); /* read ppid */
c = fgetc_unlocked(fp);
len+=13;
while (c && len < 1024) {
@@ -399,21 +399,10 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
++len;
}
appname[count]='\0';
-#ifdef HAS_MYSQL
- if(into_db) {
- snprintf(sql, 256, "insert into appNameMap values \
- ( %d, \"%s\")", pid, appname);
- if(mysql_query(&mysql,sql)) {
- fprintf(stderr, "Failed to exec sql: %s, Error: %s\n",
- sql, mysql_error(&mysql));
- exit(-1);
- }
- }
-#endif
- //fseek(fp, 0-len, SEEK_CUR);
} else if (HDR_HookID(phdr) == _HOOKID_PROCESS_EXECVE) { /* process.execve */
+ fread(&tid, 1, 4, fp); /* read tid */
fread(&pid, 1, 4, fp); /* read pid */
-
+ fread(&ppid, 1, 4, fp); /* read ppid */
c = fgetc_unlocked(fp);
len+=5;
while (c && len < 1024) {
@@ -422,10 +411,21 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
++len;
}
appname[count]='\0';
+ } else if (HDR_HookID(phdr) == _HOOKID_PROCESS_FORK) {
+ fread(&tid, 1, 4, fp); /* read tid */
+ fread(&pid, 1, 4, fp); /* read pid */
+ fread(&ppid, 1, 4, fp); /* read ppid */
+
+ strncpy(appname, (char *)(g_tree_lookup(appNameTree,(gconstpointer)((long)ppid))), 256);
+
+ } else {
+ free(appname);
+ return;
+ }
+ fseek(fp, location, SEEK_SET);
#ifdef HAS_MYSQL
if(into_db) {
- snprintf(sql, 256,"insert into appNameMap values \
- ( %d, \"%s\")", pid, appname);
+ snprintf(sql, 256,"insert into appNameMap values ( %d, \"%s\")", pid, appname);
if(mysql_query(&mysql,sql)) {
fprintf(stderr, "Failed to exec SQL: %s, Error: %s\n",
sql, mysql_error(&mysql));
@@ -433,12 +433,6 @@ void register_appname(int i, FILE *fp, lket_pkt_header *phdr)
}
}
#endif
- //fseek(fp, 0-len, SEEK_CUR);
- } else {
- free(appname);
- return;
- }
- fseek(fp, location, SEEK_SET);
g_tree_insert(appNameTree, (gpointer)((long)pid), (gpointer)appname);
}
@@ -552,10 +546,7 @@ void find_init_header(FILE **infps, const int total_infiles)
#ifdef HAS_MYSQL
if(into_db) {
- if(mysql_query(&mysql, "create table trace_header \
- ( Major_Ver TINYINT, Minor_Ver TINYINT, \
- Big_Endian TINYINT, Timing_Method varchar(20), \
- Bits_Width TINYINT)" )) {
+ if(mysql_query(&mysql, "create table trace_header ( Major_Ver TINYINT, Minor_Ver TINYINT, Big_Endian TINYINT, Timing_Method varchar(20), Bits_Width TINYINT)" )) {
fprintf(stderr, "Failed to create trace_header table, Error: %s\n",
mysql_error(&mysql));
exit(-1);
@@ -564,8 +555,8 @@ void find_init_header(FILE **infps, const int total_infiles)
ver_major, ver_minor, big_endian, timing_methods_str, bits_width);
if(mysql_query(&mysql, sql)) {
- fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n",
- sql, mysql_error(&mysql));
+ fprintf(stderr, "Failed exec SQL %d: \n %s \n, Error: %s\n",
+ __LINE__, sql, mysql_error(&mysql));
exit(-1);
}
}
@@ -595,7 +586,7 @@ void print_pkt_header(lket_pkt_header *phdr)
{
long long usecs;
int sec, usec;
- int grpid, hookid, pid;
+ int grpid, hookid, pid, tid, ppid;
if(!phdr)
return;
@@ -614,9 +605,12 @@ void print_pkt_header(lket_pkt_header *phdr)
grpid = HDR_GroupID(phdr);
hookid = HDR_HookID(phdr);
pid = HDR_PID(phdr);
+ tid = HDR_TID(phdr);
+ ppid = HDR_PPID(phdr);
if(into_file) {
- fprintf(outfp, "\n%d.%d CPU:%d PID:%d ", sec, usec, HDR_CpuID(phdr), pid);
+ fprintf(outfp, "\n%d.%d CPU:%d TID:%d, PID:%d, PPID:%d, ", sec, usec,
+ HDR_CpuID(phdr), tid, pid, ppid);
if(appname_flag==1)
fprintf(outfp, "APPNAME:%s ", (char *)(g_tree_lookup(appNameTree,(gconstpointer)((long)pid))));
if(name_flag==1)
@@ -631,26 +625,26 @@ void print_pkt_header(lket_pkt_header *phdr)
long long *entrytime;
long long entryusecs;
entrytime = g_tree_lookup(events_des[_HOOKID_REGSYSEVT][grpid][hookid-1]->entrytime,
- (gconstpointer)((long)pid));
+ (gconstpointer)((long)tid));
if(entrytime==NULL) // key not found
entryusecs = 0;
else
entryusecs = *entrytime;
- snprintf(sql_col, 64, "groupid, hookid, usec, process_id, \
+ snprintf(sql_col, 128, "groupid, hookid, usec, thread_id, process_id, parentprocess_id, \
cpu_id, entry_usec,");
- snprintf(sql_val, 256, "%d, %d, %lld, %d, %d, %lld,", grpid,
- hookid, usecs, pid, HDR_CpuID(phdr),
+ snprintf(sql_val, 256, "%d, %d, %lld, %d, %d, %d, %d, %lld,", grpid,
+ hookid, usecs, tid, pid, ppid, HDR_CpuID(phdr),
entryusecs);
} else {
- snprintf(sql_col, 64, "groupid, hookid, usec, process_id, cpu_id,");
- snprintf(sql_val, 256, "%d, %d, %lld, %d, %d, ", grpid,
- hookid, usecs, pid, HDR_CpuID(phdr));
+ snprintf(sql_col, 128, "groupid, hookid, usec, thread_id, process_id, parentprocess_id, cpu_id,");
+ snprintf(sql_val, 256, "%d, %d, %lld, %d, %d, %d, %d, ", grpid,
+ hookid, usecs, tid, pid, ppid, HDR_CpuID(phdr));
}
if(hookid%2) {
char *entrytime = malloc(sizeof(long long));
*((long long *)entrytime) = usecs;
g_tree_insert(events_des[_HOOKID_REGSYSEVT][grpid][hookid]->entrytime,
- (gpointer)((long)pid), (gpointer)entrytime);
+ (gpointer)((long)tid), (gpointer)entrytime);
}
}
#endif
@@ -697,23 +691,21 @@ void register_evt_desc(FILE *infp, size_t size)
compareFunc, NULL, NULL, destroyTreeData);
if(into_db) {
if(!has_table) {
- snprintf(sql, 1024, "create table table_desc ( table_name \
- varchar(6), table_desc varchar(32))");
+ snprintf(sql, 1024, "create table table_desc ( table_name varchar(6), table_desc varchar(32))");
if(mysql_query(&mysql, sql)) {
- fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n",
- sql, mysql_error(&mysql));
+ fprintf(stderr, "Failed exec SQL %d: \n %s \n, Error: %s\n",
+ __LINE__, sql, mysql_error(&mysql));
exit(-1);
}
has_table = 1;
}
- snprintf(sql, 1024, "insert into table_desc ( table_name,\
- table_desc) values ( \"%d_%d\", \"%s\")", grpid, hookid,
+ snprintf(sql, 1024, "insert into table_desc ( table_name, table_desc) values ( \"%d_%d\", \"%s\")", grpid, hookid,
evt_body+2);
if(mysql_query(&mysql, sql)) {
- fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n",
- sql, mysql_error(&mysql));
+ fprintf(stderr, "Failed exec SQL:%d \n %s \n, Error: %s\n",
+ __LINE__, sql, mysql_error(&mysql));
exit(-1);
}
}
@@ -747,15 +739,9 @@ void register_events(int evt_type, FILE *infp, size_t size)
if(evt_type==_HOOKID_REGSYSEVT) { /* if sys event, create a table */
if(!(hookid%2)) {/* if this is a return type event, should record
the entry time of this event */
- snprintf(sql, 1024, "create table %d_%d \
- ( groupid TINYINT, hookid TINYINT, usec BIGINT,\
- process_id INT, cpu_id TINYINT, \
- entry_usec BIGINT,", grpid, hookid);
+ snprintf(sql, 1024, "create table %d_%d ( groupid TINYINT, hookid TINYINT, usec BIGINT, thread_id INT, process_id INT, parentprocess_id INT, cpu_id TINYINT, entry_usec BIGINT,", grpid, hookid);
} else {
- snprintf(sql, 1024, "create table %d_%d \
- ( groupid TINYINT, hookid TINYINT, \
- usec BIGINT, process_id INT, \
- cpu_id TINYINT,", grpid, hookid);
+ snprintf(sql, 1024, "create table %d_%d ( groupid TINYINT, hookid TINYINT, usec BIGINT, thread_id INT, process_id INT, parentprocess_id INT, cpu_id TINYINT,", grpid, hookid);
}
}
if(evt_type==_HOOKID_REGUSREVT) { /* if user event, alter an existing table */
@@ -822,8 +808,8 @@ gen_sql:
sql[strlen(sql)-1]='\0';
if(mysql_query(&mysql, sql)) {
- fprintf(stderr, "Failed exec SQL: \n %s \n, Error: %s\n",
- sql, mysql_error(&mysql));
+ fprintf(stderr, "Failed exec SQL %d: \n %s \n, Error: %s\n",
+ __LINE__, sql, mysql_error(&mysql));
exit(-1);
}
}
@@ -997,8 +983,8 @@ int dump_data(lket_pkt_header header, FILE *infp)
if(sql_count >= INSERT_THRESHOLD) {
if(mysql_query(&mysql, sqlStatement)) {
- fprintf(stderr, "Failed exec SQL:\n%s\n, Error:\n%s\n",
- sqlStatement, mysql_error(&mysql));
+ fprintf(stderr, "Failed exec SQL %d:\n%s\n, Error:\n%s\n",
+ __LINE__, sqlStatement, mysql_error(&mysql));
exit(-1);
}
while(!mysql_next_result(&mysql));
diff --git a/runtime/lket/b2a/lket_b2a.h b/runtime/lket/b2a/lket_b2a.h
index 464742db..befbc164 100644
--- a/runtime/lket/b2a/lket_b2a.h
+++ b/runtime/lket/b2a/lket_b2a.h
@@ -38,15 +38,19 @@ typedef struct _lket_pkt_header {
int16_t total_size;
int16_t sys_size;
int64_t microsecond;
+ /* tid_pid is (tid<<32|pid) */
+ int64_t tid_pid;
/* aggr is the bit-OP of:
- (int64_t)current->pid << 32 |
+ (int64_t)current->parent->tgid << 32 |
(int32_t)GroupID << 24 | (int32_t)hookID << 16 |
(int16_t)current->thread_info->cpu << 8
*/
int64_t aggr;
} __attribute__((packed)) lket_pkt_header;
-#define HDR_PID(ptr) (int32_t)(((ptr)->aggr)>>32)
+#define HDR_TID(ptr) (int32_t)(((ptr)->tid_pid)>>32)
+#define HDR_PID(ptr) (int32_t)((ptr)->tid_pid)
+#define HDR_PPID(ptr) (int32_t)(((ptr)->aggr)>>32)
#define HDR_GroupID(ptr) (int8_t)(((ptr)->aggr)>>24)
#define HDR_HookID(ptr) (int8_t)(((ptr)->aggr)>>16)
#define HDR_CpuID(ptr) (int8_t)(((ptr)->aggr)>>8)