> On Sep 7, 2016, at 1:21 AM, Ard Biesheuvel <[email protected]> wrote:
> 
> When dumping the CPU state after an unhandled fault, walk the stack
> frames and decode the return addresses so we can show a minimal
> backtrace. Unfortunately, we do not have sufficient information to
> show the function names, but at least we can see the modules and the
> return addresses inside the modules.
> 

Ard,

In these kind of dumps I find it useful to also display the offset into the 
PE/COFF image. 
ArmVeNorFlashDxe.dll (0x00000000F5EA4AE8)  loaded at 0x00000000F5E90000 offset 
0x00014AE9

The reason is it makes it easy to use the gdb list command to display the C 
source code. 
gdb 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll
 
(gdb) list * 0x14AE9

This assumes the .dll is the ELF linked near zero to accommodate the PE/COFF 
header, or PE/COFF.  For TE you need to know the adjustment value from the TE 
header. 

Seems like it would be possible to write a script to symbolicate the stack 
trace on the build machine. 

It might be more useful to have the summary 1st (I have to admit I like things 
to line up in columns):
Synchronous Exception at 0x00000000F5EA4C8C
PC 0x00000000F5EA4C8C (0x00000000F5E90000+0x00014C8C) ArmVeNorFlashDxe.dll  
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG
PC 0x00000000F5EA4AE8 (0x00000000F5E90000+0x00014AE9) ArmVeNorFlashDxe.dll  
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG
PC 0x00000000F5EA1BFC (0x00000000F5E90000+0x00011BFC) ArmVeNorFlashDxe.dll  
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG

In the example above I also made the the exception line the summary and showed 
that location like the rest of the frame. This seems to be the way debuggers 
like to do it so it seems to match with what a developer would expect. 

Thanks,

Andrew Fish

PS. Just saw the remove the path commit. So maybe something like:

Synchronous Exception at 0x00000000F5EA4C8C
PC 0x00000000F5EA4C8C (0x00000000F5E90000+0x00014C8C) ArmVeNorFlashDxe.dll  [1]
PC 0x00000000F5EA4AE8 (0x00000000F5E90000+0x00014AE9) ArmVeNorFlashDxe.dll  [1]
PC 0x00000000F5EA1BFC (0x00000000F5E90000+0x00011BFC) ArmVeNorFlashDxe.dll [1]
PC 0x00000000FADC454C (0x00000000FADC3000+0x0000154C) Fat.dll [2]

[1] 
/home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG
[2] 
/work/jenkins/workspace/ap-uefi-bin/EDK2_ARCH/ARM/EDK2_BINARY/FatPkg/label/sas-sw/Build/Fat/RELEASE_GCC49/AARCH64/FatPkg/EnhancedFatDxe/Fat/DEBUG/

I think your example points out why it is useful.  Also the Shell or 
application running at he Shell could come from different locations, but still 
be on your system. Not to mention if you are debugging you might as well dump 
out all the information you have. 

> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <[email protected]>
> ---
> 
> Example output:
> 
> Synchronous Exception at 0x00000000F5EA4C8C
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll
>  loaded at 0x00000000F5E90000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll
>  (0x00000000F5EA4AE8) loaded at 0x00000000F5E90000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll
>  (0x00000000F5EA1BFC) loaded at 0x00000000F5E90000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe/DEBUG/ArmVeNorFlashDxe.dll
>  (0x00000000F5EA23F4) loaded at 0x00000000F5E90000
> called from 
> /work/jenkins/workspace/ap-uefi-bin/EDK2_ARCH/ARM/EDK2_BINARY/FatPkg/label/sas-sw/Build/Fat/RELEASE_GCC49/AARCH64/FatPkg/EnhancedFatDxe/Fat/DEBUG/Fat.dll
>  (0x00000000FADC454C) loaded at 0x00000000FADC3000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
>  (0x00000000FE47C868) loaded at 0x00000000FE471000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
>  (0x00000000FAE2C50C) loaded at 0x00000000FAE01000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
>  (0x00000000FAE2C674) loaded at 0x00000000FAE01000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
>  (0x00000000FAE2C264) loaded at 0x00000000FAE01000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
>  (0x00000000FAE36998) loaded at 0x00000000FAE01000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
>  (0x00000000FAE03668) loaded at 0x00000000FAE01000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
>  (0x00000000FE4733F0) loaded at 0x00000000FE471000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
>  (0x00000000FE4724A0) loaded at 0x00000000FE471000
> called from 
> /home/ard/build/edk2/Build/ArmVExpress-FVP-AArch64/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
>  (0x00000000FE472024) loaded at 0x00000000FE471000
> ---
> .../AArch64/DefaultExceptionHandler.c               | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
> 
> diff --git 
> a/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c 
> b/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
> index 31fc936b21ff..84b442f2b6f4 100644
> --- 
> a/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
> +++ 
> b/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c
> @@ -152,9 +152,30 @@ DefaultExceptionHandler (
>     CHAR8  *Pdb;
>     UINTN  ImageBase;
>     UINTN  PeCoffSizeOfHeader;
> +    UINT64 *Fp;
> +
>     Pdb = GetImageName (SystemContext.SystemContextAArch64->ELR, &ImageBase, 
> &PeCoffSizeOfHeader);
>     if (Pdb != NULL) {
>       DEBUG ((EFI_D_ERROR, "%a loaded at 0x%016lx \n", Pdb, ImageBase));
> +
> +      Pdb = GetImageName (SystemContext.SystemContextAArch64->LR, &ImageBase,
> +              &PeCoffSizeOfHeader);
> +      if (Pdb != NULL) {
> +        DEBUG ((EFI_D_ERROR, "called from %a (0x%016lx) loaded at 0x%016lx 
> \n",
> +          Pdb, SystemContext.SystemContextAArch64->LR, ImageBase));
> +      }
> +      for (Fp = (UINT64 *)SystemContext.SystemContextAArch64->FP;
> +           *Fp != 0;
> +           Fp = (UINT64 *)Fp[0]) {
> +        if (Fp[1] == SystemContext.SystemContextAArch64->LR) {
> +         continue;
> +        }
> +        Pdb = GetImageName (Fp[1], &ImageBase, &PeCoffSizeOfHeader);
> +        if (Pdb != NULL) {
> +          DEBUG ((EFI_D_ERROR, "called from %a (0x%016lx) loaded at 0x%016lx 
> \n",
> +            Pdb, Fp[1], ImageBase));
> +        }
> +      }
>     }
>   DEBUG_CODE_END ();
> 
> -- 
> 2.7.4
> 
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to