1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
#!/usr/bin/stap
/*
* Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved.
*
* showerror.stp - Capture context about certain DB errors.
*
* This shows the stack when a variant of DB->err() is called.
* Specify the target process on the command line as
* -p <pid> or
* -c "<program> [<args>..]"
*
* This script does not require DWARF symbols in libdb.
*/
global errors, errorcount, maxlimit;
probe begin
{
errorcount = 0;
maxlimit = -1;
%( $# >= 2 %? maxlimit = $2 %)
printf("Display DB stack when ");
if (pid() == 0)
printf("an application using %s", @1)
else
printf("process %d", pid());
printf(" prints a DB internal error message: limit %d\n", maxlimit);
}
/* __db_err(ENV *, int errorcode, char *message, ...) */
probe process(@1).function("__db_err").call
{
message = user_string(pointer_arg(3));
printf("DB error %d message \"%s\"(%x,...) from:\n",
int_arg(2), message, ulong_arg(4));
print_backtrace();
errors[message, backtrace()] <<< 1;
if (++errorcount == maxlimit)
exit();
}
/* __db_errx(ENV *, char *message, ...) */
probe process(@1).function("__db_errx").call
{
message = user_string(pointer_arg(2));
printf("DB error message \"%s\"(%x,...) parms %s from:\n", message,
int_arg(3), $$parms);
print_backtrace();
errors[message, backtrace()] <<< 1;
if (++errorcount == maxlimit)
exit();
}
/* __env_panic(ENV *, int errorcode) */
probe process(@1).function("__env_panic").call
{
printf("DB panic with error code %d from:\n", int_arg(2));
print_backtrace();
if (++errorcount == maxlimit)
exit();
}
|