[Crash-utility] [PATCH] s390dbf: Add -s option for saving s390 debug feature
Dave Anderson
anderson at redhat.com
Mon Nov 29 13:47:36 UTC 2010
----- "Michael Holzheu" <holzheu at linux.vnet.ibm.com> wrote:
> Hello Dave,
>
> Could you please include the following patch:
>
> This patch adds a new option "-s" to the s390dbf command. With this option
> it is possible to save the content of the s390 debug feature (a driver
> tracing infrastructure) to the specified directory. As output exactly the same
> directory tree is created as it can be seen on a live system under
> "/sys/kernel/debug/s390dbf".
>
> Michael
Sure -- queued for the next release.
Thanks,
Dave
> Signed-off-by: Michael Holzheu <holzheu at linux.vnet.ibm.com>
> ---
> s390dbf.c | 126
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 113 insertions(+), 13 deletions(-)
>
> --- a/s390dbf.c
> +++ b/s390dbf.c
> @@ -204,6 +204,7 @@ static inline kaddr_t kl_funcaddr(kaddr_
>
> #define LOAD_FLAG (1 << C_LFLG_SHFT)
> #define VIEWS_FLAG (2 << C_LFLG_SHFT)
> +#define SAVE_DBF_FLAG (4 << C_LFLG_SHFT)
>
> #ifndef MIN
> #define MIN(a,b) (((a)<(b))?(a):(b))
> @@ -215,7 +216,7 @@ static inline kaddr_t kl_funcaddr(kaddr_
> #define DBF_VERSION_V2 2
> #define PAGE_SIZE 4096
> #define DEBUG_MAX_VIEWS 10 /* max number of views in proc fs */
> -#define DEBUG_MAX_PROCF_LEN 16 /* max length for a proc file name */
> +#define DEBUG_MAX_PROCF_LEN 64 /* max length for a proc file name */
> #define DEBUG_SPRINTF_MAX_ARGS 10
>
> /* define debug-structures for lcrash */
> @@ -1039,6 +1040,18 @@ free_debug_info_v2(debug_info_t * db_inf
> free(db_info);
> }
>
> +static void
> +debug_write_output(debug_info_t *db_info, debug_view_t *db_view, FILE
> * fp)
> +{
> + if (dbf_version == DBF_VERSION_V1) {
> + debug_format_output_v1(db_info, db_view, fp);
> + free_debug_info_v1(db_info);
> + } else {
> + debug_format_output_v2(db_info, db_view, fp);
> + free_debug_info_v2(db_info);
> + }
> +}
> +
> static int
> get_debug_areas(void)
> {
> @@ -1140,13 +1153,7 @@ list_one_view(char *area_name, char *vie
> fprintf(cmd->efp, "View '%s' not registered!\n", view_name);
> return -1;
> }
> - if(dbf_version == DBF_VERSION_V1){
> - debug_format_output_v1(db_info, db_view, cmd->ofp);
> - free_debug_info_v1(db_info);
> - } else {
> - debug_format_output_v2(db_info, db_view, cmd->ofp);
> - free_debug_info_v2(db_info);
> - }
> + debug_write_output(db_info, db_view, cmd->ofp);
> return 0;
> }
>
> @@ -1222,6 +1229,86 @@ load_debug_view(const char *path, comman
> }
> #endif
>
> +static int
> +save_one_view(const char *dbf_dir_name, const char *area_name,
> + const char *view_name, command_t *cmd)
> +{
> + char path_view[PATH_MAX];
> + debug_info_t *db_info;
> + debug_view_t *db_view;
> + FILE *view_fh;
> +
> + db_info = find_debug_area(area_name);
> + if (db_info == NULL) {
> + fprintf(cmd->efp, "Debug log '%s' not found!\n", area_name);
> + return -1;
> + }
> + db_info = get_debug_info(db_info->addr, 1);
> +
> + db_view = find_lcrash_debug_view(view_name);
> + if (db_view == NULL) {
> + fprintf(cmd->efp, "View '%s' not registered!\n", view_name);
> + return -1;
> + }
> + sprintf(path_view, "%s/%s/%s", dbf_dir_name, area_name, view_name);
> + view_fh = fopen(path_view, "w");
> + if (view_fh == NULL) {
> + fprintf(cmd->efp, "Could not create file: %s (%s)\n",
> + path_view, strerror(errno));
> + return -1;
> + }
> + debug_write_output(db_info, db_view, view_fh);
> + fclose(view_fh);
> + return 0;
> +}
> +
> +static int
> +save_one_area(const char *dbf_dir_name, const char *area_name,
> command_t *cmd)
> +{
> + char dir_name_area[PATH_MAX];
> + debug_info_t *db_info;
> + int i;
> +
> + db_info = find_debug_area(area_name);
> + if (db_info == NULL) {
> + fprintf(cmd->efp, "Debug log '%s' not found!\n", area_name);
> + return -1;
> + }
> + sprintf(dir_name_area, "%s/%s", dbf_dir_name, area_name);
> + if (mkdir(dir_name_area, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) !=
> 0) {
> + fprintf(cmd->efp, "Could not create directory: %s (%s)\n",
> + dir_name_area, strerror(errno));
> + return -1;
> + }
> + for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
> + if (db_info->views[i] == NULL)
> + continue;
> + if (!find_lcrash_debug_view(db_info->views[i]->name))
> + continue;
> + save_one_view(dbf_dir_name, area_name, db_info->views[i]->name,
> + cmd);
> + }
> + return 0;
> +}
> +
> +static void
> +save_dbf(const char *dbf_dir_name, command_t *cmd)
> +{
> + debug_info_t *act_debug_info = debug_area_first;
> + FILE *ofp = cmd->ofp;
> +
> + fprintf(ofp, "Saving s390dbf to directory \"%s\"\n", dbf_dir_name);
> + if (mkdir(dbf_dir_name, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
> {
> + fprintf(cmd->efp, "Could not create directory: %s (%s)\n",
> + dbf_dir_name, strerror(errno));
> + return;
> + }
> + while (act_debug_info != NULL) {
> + save_one_area(dbf_dir_name, act_debug_info->name, cmd);
> + act_debug_info = act_debug_info->next;
> + }
> +}
> +
> /*
> * s390dbf_cmd() -- Run the 's390dbf' command.
> */
> @@ -1272,6 +1359,14 @@ s390dbf_cmd(command_t * cmd)
> if(get_debug_areas() == -1)
> return -1;
>
> + if (cmd->flags & SAVE_DBF_FLAG) {
> + if (cmd->nargs != 2) {
> + fprintf(cmd->efp, "Specify directory name for -s\n");
> + return 1;
> + }
> + save_dbf(cmd->args[1], cmd);
> + return 0;
> + }
> switch (cmd->nargs) {
> case 0:
> rc = list_areas(cmd->ofp);
> @@ -1289,7 +1384,7 @@ s390dbf_cmd(command_t * cmd)
> return rc;
> }
>
> -#define _S390DBF_USAGE " [-v] [debug log] [debug view]"
> +#define _S390DBF_USAGE " [-v] [-s dirname] [debug log] [debug view]"
>
> /*
> * s390dbf_usage() -- Print the usage string for the 's390dbf'
> command.
> @@ -1307,17 +1402,19 @@ s390dbf_usage(command_t * cmd)
> char *help_s390dbf[] = {
> "s390dbf",
> "s390dbf prints out debug feature logs",
> - "[-v] [debug_log] [debug_log view]",
> + "[-v] [-s dirname] [debug log] [debug view]"
> "",
> "Display Debug logs:",
> " + If called without parameters, all active debug logs are
> listed.",
> - " + If called with '-v', all debug views which are available to",
> - " 'crash' are listed",
> " + If called with the name of a debug log, all debug-views for
> which",
> " the debug-log has registered are listed. It is possible
> thatsome",
> " of the debug views are not available to 'crash'.",
> " + If called with the name of a debug-log and an available
> viewname,",
> " the specified view is printed.",
> + " + If called with '-s dirname', the s390dbf is saved to the
> specified",
> + " directory",
> + " + If called with '-v', all debug views which are available to",
> + " 'crash' are listed",
> NULL
> };
>
> @@ -1336,11 +1433,14 @@ void cmd_s390dbf()
> for (i=1; i < argcnt; i++)
> cmd.args[i-1] = args[i];
>
> - while ((c = getopt(argcnt, args, "v")) != EOF) {
> + while ((c = getopt(argcnt, args, "vs")) != EOF) {
> switch(c) {
> case 'v':
> cmd.flags |= VIEWS_FLAG;
> break;
> + case 's':
> + cmd.flags |= SAVE_DBF_FLAG;
> + break;
> default:
> s390dbf_usage(&cmd);
> return;
>
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
More information about the Crash-utility
mailing list