[igt-dev] [PATCH i-g-t 1/2] lib/igt_core: use print_backtrace() on internal_assert()

Petri Latvala petri.latvala at intel.com
Wed May 25 12:57:34 UTC 2022


On Tue, May 24, 2022 at 02:07:16PM +0200, Mauro Carvalho Chehab wrote:
> From: Mauro Carvalho Chehab <mchehab at kernel.org>
> 
> When internal_assert() hits, it is desired to know what part
> of the code actually hit the issue.
> 
> Signed-off-by: Mauro Carvalho Chehab <mchehab at kernel.org>

Reviewed-by: Petri Latvala <petri.latvala at intel.com>


> ---
>  lib/igt_core.c | 124 +++++++++++++++++++++++++------------------------
>  1 file changed, 63 insertions(+), 61 deletions(-)
> 
> diff --git a/lib/igt_core.c b/lib/igt_core.c
> index b7116f4e5433..e7425326b7f0 100644
> --- a/lib/igt_core.c
> +++ b/lib/igt_core.c
> @@ -351,6 +351,67 @@ static bool stderr_needs_sentinel = false;
>  
>  static int _igt_dynamic_tests_executed = -1;
>  
> +static void print_backtrace(void)
> +{
> +	unw_cursor_t cursor;
> +	unw_context_t uc;
> +	int stack_num = 0;
> +
> +	Dwfl_Callbacks cbs = {
> +		.find_elf = dwfl_linux_proc_find_elf,
> +		.find_debuginfo = dwfl_standard_find_debuginfo,
> +	};
> +
> +	Dwfl *dwfl = dwfl_begin(&cbs);
> +
> +	if (dwfl_linux_proc_report(dwfl, getpid())) {
> +		dwfl_end(dwfl);
> +		dwfl = NULL;
> +	} else
> +		dwfl_report_end(dwfl, NULL, NULL);
> +
> +	igt_info("Stack trace:\n");
> +
> +	unw_getcontext(&uc);
> +	unw_init_local(&cursor, &uc);
> +	while (unw_step(&cursor) > 0) {
> +		char name[255];
> +		unw_word_t off, ip;
> +		Dwfl_Module *mod = NULL;
> +
> +		unw_get_reg(&cursor, UNW_REG_IP, &ip);
> +
> +		if (dwfl)
> +			mod = dwfl_addrmodule(dwfl, ip);
> +
> +		if (mod) {
> +			const char *src, *dwfl_name;
> +			Dwfl_Line *line;
> +			int lineno;
> +			GElf_Sym sym;
> +
> +			line = dwfl_module_getsrc(mod, ip);
> +			dwfl_name = dwfl_module_addrsym(mod, ip, &sym, NULL);
> +
> +			if (line && dwfl_name) {
> +				src = dwfl_lineinfo(line, NULL, &lineno, NULL, NULL, NULL);
> +				igt_info("  #%d %s:%d %s()\n", stack_num++, src, lineno, dwfl_name);
> +				continue;
> +			}
> +		}
> +
> +		if (unw_get_proc_name(&cursor, name, 255, &off) < 0)
> +			igt_info("  #%d [<unknown>+0x%x]\n", stack_num++,
> +				 (unsigned int) ip);
> +		else
> +			igt_info("  #%d [%s+0x%x]\n", stack_num++, name,
> +				 (unsigned int) off);
> +	}
> +
> +	if (dwfl)
> +		dwfl_end(dwfl);
> +}
> +
>  __attribute__((format(printf, 2, 3)))
>  static void internal_assert(bool cond, const char *format, ...)
>  {
> @@ -362,6 +423,8 @@ static void internal_assert(bool cond, const char *format, ...)
>  		va_end(ap);
>  		fprintf(stderr, "please refer to lib/igt_core documentation\n");
>  
> +		print_backtrace();
> +
>  		assert(0);
>  	}
>  }
> @@ -1766,67 +1829,6 @@ static void write_stderr(const char *str)
>  	__write_stderr(str, strlen(str));
>  }
>  
> -static void print_backtrace(void)
> -{
> -	unw_cursor_t cursor;
> -	unw_context_t uc;
> -	int stack_num = 0;
> -
> -	Dwfl_Callbacks cbs = {
> -		.find_elf = dwfl_linux_proc_find_elf,
> -		.find_debuginfo = dwfl_standard_find_debuginfo,
> -	};
> -
> -	Dwfl *dwfl = dwfl_begin(&cbs);
> -
> -	if (dwfl_linux_proc_report(dwfl, getpid())) {
> -		dwfl_end(dwfl);
> -		dwfl = NULL;
> -	} else
> -		dwfl_report_end(dwfl, NULL, NULL);
> -
> -	igt_info("Stack trace:\n");
> -
> -	unw_getcontext(&uc);
> -	unw_init_local(&cursor, &uc);
> -	while (unw_step(&cursor) > 0) {
> -		char name[255];
> -		unw_word_t off, ip;
> -		Dwfl_Module *mod = NULL;
> -
> -		unw_get_reg(&cursor, UNW_REG_IP, &ip);
> -
> -		if (dwfl)
> -			mod = dwfl_addrmodule(dwfl, ip);
> -
> -		if (mod) {
> -			const char *src, *dwfl_name;
> -			Dwfl_Line *line;
> -			int lineno;
> -			GElf_Sym sym;
> -
> -			line = dwfl_module_getsrc(mod, ip);
> -			dwfl_name = dwfl_module_addrsym(mod, ip, &sym, NULL);
> -
> -			if (line && dwfl_name) {
> -				src = dwfl_lineinfo(line, NULL, &lineno, NULL, NULL, NULL);
> -				igt_info("  #%d %s:%d %s()\n", stack_num++, src, lineno, dwfl_name);
> -				continue;
> -			}
> -		}
> -
> -		if (unw_get_proc_name(&cursor, name, 255, &off) < 0)
> -			igt_info("  #%d [<unknown>+0x%x]\n", stack_num++,
> -				 (unsigned int) ip);
> -		else
> -			igt_info("  #%d [%s+0x%x]\n", stack_num++, name,
> -				 (unsigned int) off);
> -	}
> -
> -	if (dwfl)
> -		dwfl_end(dwfl);
> -}
> -
>  static const char hex[] = "0123456789abcdef";
>  
>  static void
> -- 
> 2.36.1
> 


More information about the igt-dev mailing list