summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lket.5.in4
-rw-r--r--runtime/ChangeLog3
-rw-r--r--runtime/lket/b2a/lket_b2a.c112
-rw-r--r--runtime/lket/b2a/lket_b2a.h8
-rw-r--r--tapset/LKET/Changelog10
-rwxr-xr-xtapset/LKET/lket_trace.stp15
-rwxr-xr-xtapset/LKET/process.stp8
-rwxr-xr-xtapset/LKET/register_event.stp2
8 files changed, 84 insertions, 78 deletions
diff --git a/lket.5.in b/lket.5.in
index 1798a38b..a2f21839 100644
--- a/lket.5.in
+++ b/lket.5.in
@@ -201,7 +201,7 @@ The data common(i.e.
in the following subsecions) to all event hooks is:
.RS
-.B timestamp(INT64),(tid<<32 | groupID<<24 | hookID<<16 | cpu_id<<8)(INT64)
+.B timestamp(INT64),(tid<<32|pid)(INT64),(ppid<<32|groupID<<24|hookID<<16|cpu_id<<8)(INT64)
.RE
Each event hook group is a collection of those hooks that have
@@ -289,7 +289,7 @@ Trace execve of new processes
Data format is:
-.I common_data, pid(INT32), new_process_name(STRING)
+.I common_data, tid(INT32), pid(INT32), ppid(INT32), new_process_name(STRING)
.SS SIGNAL
You could use
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)
diff --git a/tapset/LKET/Changelog b/tapset/LKET/Changelog
index a3baabdf..9b61f74e 100644
--- a/tapset/LKET/Changelog
+++ b/tapset/LKET/Changelog
@@ -1,3 +1,13 @@
+2006-11-19 Li Guanglei <guanglei@cn.ibm.com>
+ bugfix for #3526
+ * 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.
+
2006-11-17 Li Guanglei <guanglei@cn.ibm.com>
From Eugene Teo <eteo@redhat.com>
diff --git a/tapset/LKET/lket_trace.stp b/tapset/LKET/lket_trace.stp
index 32577524..81d47dd6 100755
--- a/tapset/LKET/lket_trace.stp
+++ b/tapset/LKET/lket_trace.stp
@@ -149,9 +149,10 @@ static inline int this_event_len(void)
/* we use 2 bytes to store the length. */
#define _lket_trace(GroupID, hookID, fmt, args...) do { \
if(timing_method == TIMING_GETCYCLES) { \
- _stp_printf("%2b%2n%8b%8b"fmt, (_FMT_)0, \
+ _stp_printf("%2b%2n%8b%8b%8b"fmt, (_FMT_)0, \
(_FMT_)get_cycles(), \
- (_FMT_)((int64_t)current->pid << 32 | \
+ (_FMT_)((int64_t)current->pid << 32 | (int32_t)current->tgid),\
+ (_FMT_)((int64_t)current->parent->tgid << 32 | \
(int32_t)GroupID << 24 | (int32_t)hookID << 16 | \
(int16_t)current->thread_info->cpu << 8), \
args); \
@@ -159,17 +160,19 @@ static inline int this_event_len(void)
else if(timing_method == TIMING_GETTIMEOFDAY) { \
struct timeval tv; \
do_gettimeofday (&tv); \
- _stp_printf("%2b%2n%8b%8b"fmt, (_FMT_)0, \
+ _stp_printf("%2b%2n%8b%8b%8b"fmt, (_FMT_)0, \
(_FMT_)(tv.tv_sec*1000000LL + tv.tv_usec), \
- (_FMT_)((int64_t)current->pid << 32 | \
+ (_FMT_)((int64_t)current->pid << 32 | (int32_t)current->tgid),\
+ (_FMT_)((int64_t)current->parent->tgid << 32 | \
(int32_t)GroupID << 24 | (int32_t)hookID << 16 | \
(int16_t)current->thread_info->cpu << 8), \
args); \
} \
else { \
- _stp_printf("%2b%2n%8b%8b"fmt, (_FMT_)0, \
+ _stp_printf("%2b%2n%8b%8b%8b"fmt, (_FMT_)0, \
(_FMT_)pfn_schedclock(), \
- (_FMT_)((int64_t)current->pid << 32 | \
+ (_FMT_)((int64_t)current->pid << 32 | (int32_t)current->tgid),\
+ (_FMT_)((int64_t)current->parent->tgid << 32 | \
(int32_t)GroupID << 24 | (int32_t)hookID << 16 | \
(int16_t)current->thread_info->cpu << 8), \
args); \
diff --git a/tapset/LKET/process.stp b/tapset/LKET/process.stp
index 12eca381..fb02614b 100755
--- a/tapset/LKET/process.stp
+++ b/tapset/LKET/process.stp
@@ -12,8 +12,9 @@
function log_execve_tracedata(var:long)
%{
long tmp=(long)THIS->var;
- _lket_trace(_GROUP_PROCESS, _HOOKID_PROCESS_EXECVE, "%4b%0s",
- (_FMT_)current->tgid, (char *)tmp);
+ _lket_trace(_GROUP_PROCESS, _HOOKID_PROCESS_EXECVE, "%4b%4b%4b%0s",
+ (_FMT_)current->pid, (_FMT_)current->tgid,
+ (_FMT_)current->parent->tgid, (char *)tmp);
%}
@@ -46,8 +47,7 @@ function process_snapshot()
/* iterate all the processes, and record the pid and process
name for each entry */
- list_for_each(cur, head) {
- tsk = (struct task_struct *)(list_entry(cur, struct task_struct, tasks));
+ for_each_process(tsk) {
_lket_trace(_GROUP_PROCESS, _HOOKID_PROCESS_SNAPSHOT, "%4b%4b%4b%0s",
(_FMT_)tsk->pid, (_FMT_)tsk->tgid, (_FMT_)tsk->parent->tgid, tsk->comm);
#if !defined(ASCII_TRACE)
diff --git a/tapset/LKET/register_event.stp b/tapset/LKET/register_event.stp
index 4bc3fcd4..333471e8 100755
--- a/tapset/LKET/register_event.stp
+++ b/tapset/LKET/register_event.stp
@@ -164,7 +164,7 @@ function register_sys_events()
_register_sys_event("process_snapshot", _GROUP_PROCESS, _HOOKID_PROCESS_SNAPSHOT,
"INT32:INT32:INT32:STRING", "tid:pid:ppid:pname");
_register_sys_event("process.execve", _GROUP_PROCESS, _HOOKID_PROCESS_EXECVE,
- "INT32:STRING", "pid:pname");
+ "INT32:INT32:INT32:STRING", "tid:pid:ppid:pname");
_register_sys_event("process.fork", _GROUP_PROCESS, _HOOKID_PROCESS_FORK,
"INT32:INT32:INT32", "tid:pid:ppid");
_register_sys_event("process.exit.entry", _GROUP_PROCESS, _HOOKID_PROCESS_EXIT_ENTRY,