[转]GDBINT gdb internal Notes …

来源:互联网 发布:阿里云静态资源 编辑:程序博客网 时间:2024/06/03 17:35
Target ArchitectureDefinition
一种CPU的体系结构,是一个target architecture. GDB使用 struct gdbarch*来描述一种CPU的体系结构, 这个C结构及其代码,由脚本gdbarch.sh来产生.
Operating System ABI VariantHandling
OS的ABI主要影响target defination的两个部分:sniffers andhandlers. sniffers用 于确定一种binfmt的文件属于那种BFDarchitecture/flavour 组合. architecture可以是通配也可以是针对特定architecture,前者叫做genaric 后者叫specific.一种specific的match会覆盖通配匹配.可能存在一多个OS匹配使用同一种binfmt,所以OS ABIframework为ELF提供了一个generic sniffer:检查ELF的EI_OSABI域(和其他的特征域).
handler 用于适配gdbarchstructure的OS ABI特性. 可能一个OS只提供一种handler,为每个BFDarchitecture公用.这里给出一个OS ABI 的overview(具体参考GDBINI)
defs.h :OSABI变种的定义GDB_OSABI_UNINITIALIZED :Used for struct gdbarch_info if ABI is still uninitialized.

GDB_OSABI_UNKNOWN: The ABI of theinferior is unknown. The default gdbarch settings for thearchitecture will be used.

GDB_OSABI_SVR4:UNIX System V Release4.

GDB_OSABI_LINUX  GDB_OSABI_WINCE  GDB_OSABI_GO32(DJGPP)

OS ABI framework 接口函数:
const char *gdbarch_osabi_name (enumgdb_osabi osabi)

void gdbarch_register_osabi (...)

void gdbarch_register_osabi_sniffer (.....)

enum gdb_osabi gdbarch_lookup_osabi (bfd *abfd)

void gdbarch_init_osabi (structgdbarch info info, struct gdbarch *gdbarch, enum gdb_osabiosabi)

void generic_elf_osabi_sniff_abi_tag_sections (bfd*abfd, asection *sect, void *obj)


Initializing a NewArchitecture

   每个gdbarch对应一个BFDarchitecture,并有一个常量bfd_arch_xxx. 通过函数register_gdbarch_init 注册gdbarch,通常在 _initialize_filename 中调用注册函数,这样就加入了GDB启动流程.(细节请参考GDBINT)


Registers andMemory

GDB 采用的target machine模型是十分简单的:GDB假定一种机器包含一组寄存器和一块内存,每个寄存器有一定的大小.GDB把寄存器的一切封装到像 gdbarch_register_name这样的一系列函数中,继而做到正确处理.GDB 支持各种endian的机器:big-endian, little-endian,bi-endian(request commnet).


Pointers Are Not AlwaysAddresses

有些特殊的平台,同一个word,其用于codepointer和datapointe的时候有不同的解释,比如D10V,同样是0xC020,当用于数据地址的时候代表地址0xC020,但是用于代码地址的时候,需要转换一下,代表0x30080(详见D10V或者GDBINT).所以在GDB中,对于address和pointer是区分对待的.address代表字节地址,而pointer指向特定的数据类型:dataor code or other....,pointer需要转换以下才是address,大部分平台是相等的值,部分平台需要移位等操作.但是大部分平台上,这两者是等价的,以下函数用于转换pointer和address: (详见GDBINT)

CORE_ADDR extract_typed_address (void*buf, struct type *type)

CORE_ADDR store_typed_address (void*buf, struct type *type, CORE_ADDR addr)

CORE_ADDR value_as_address (structvalue *val)

CORE_ADDR value_from_pointer (structtype *type, CORE_ADDR addr)

CORE_ADDR gdbarch_pointer_to_address (structgdbarch *current_gdbarch, struct type *type, char *buf)

void gdbarch_address_to_pointer (structgdbarch *current_gdbarch, struct type *type, char *buf, CORE_ADDRaddr)


AddressClasses

当不同种类的address可以而从调试信息中(如DWARF2)获取时,应该定义以下宏来支持GDB认知这些区别,或者给GDB user提供类型信息.

int gdbarch_address_class_type_flags (structgdbarch *current_gdbarch, int byte_size, int dwarf2_addr_class)

char *gdbarch_address_class_type_flags_to_name (structgdbarch *current_gdbarch, int type_flags)
int gdbarch_address_class_name_to_type_flags (structgdbarch *current_gdbarch, int name, int*var{type_flags_ptr})
祥见GDBINT.

 

Raw andVirtual Register Representations

注:这里描述的内容已经过时,请参考下一节.

一些体系结构在寄存器和内存中对一个值的表达方式是不同的.用GDB的术语来定义,在寄存器中的表达方式叫raw representation,在内存中的表达方式叫做virtual representation.GDB用structvalue objects来表示这种差异.

在几乎所有的体系上,数据类型的virtual和rawrepresentations 是一致的.但是有例外,如:

  x86 提示支持一种80-bitlong doubletype,但是存储到内存时,占用12个byte:浮点数占用头是个byte,后两个byte没有用(对齐要求),因此,x86 80-bitfloating-point type 就是raw representation,twelve-byte loosely-packedarrangement 是virtual representation.

  另外,一些64-bitMIPS,使用64-bit的寄存器当作32-bit registers使用,高位是垃圾数据.所以,64-bit form,带有垃圾数据的这种表达形式是raw representation, 32-bit 形式是virtualrepresentation.

 

  GDB's registerfile, registers, 采用raw format, GDB remote protocol transmitsregister values也是raw format.如要如下的函数支持raw和virtual模式的转换.

 

intREGISTER_CONVERTIBLE (int reg)  

intDEPRECATED_REGISTER_RAW_SIZE (int reg) 

intDEPRECATED_REGISTER_VIRTUAL_SIZE (int reg)

structtype *DEPRECATED_REGISTER_VIRTUAL_TYPE (intreg)

voidREGISTER_CONVERT_TO_VIRTUAL (int reg, struct type *type, char *from,char *to)

voidREGISTER_CONVERT_TO_RAW (struct type *type, int reg, char *from,char *to)


Using Different Register and Memory DataRepresentations

Maintainer's note:GDB操作寄存器的方式正在变革中,详见 A.R.Index and Bug TrackingDatabase 2002.

这里解决的问题和上一节一样:x86 80-bit浮点寄存器,还有Alpha 可以把32 bit integer values 存到floating-pointregisters.

这种问题也可以定义如下的宏来解决:
int gdbarch_convert_register_p (structgdbarch *gdbarch, int reg)

voidgdbarch_register_to_value (struct gdbarch *gdbarch, int reg, structtype *type, char *from, char *to)

voidgdbarch_value_to_register (struct gdbarch *gdbarch, struct type *type,int reg, char *from, char *to)

voidREGISTER_CONVERT_TO_TYPE (int regnum, struct type *type, char*buf)

int gdbarch_char_signed(gdbarch)

int gdbarch_double_bit(gdbarch)

int gdbarch_float_bit (gdbarch)

int gdbarch_int_bit (gdbarch)

int gdbarch_long_bit (gdbarch)

int gdbarch_long_double_bit(gdbarch)

int gdbarch_long_long_bit(gdbarch)

int gdbarch_ptr_bit (gdbarch)

int gdbarch_short_bit (gdbarch)

int gdbarch_cannot_store_register(gdbarch, regnum)

int gdbarch_convert_register_p(gdbarch, regnum, struct type *type)

 

void gdbarch_value_to_register(gdbarch, frame, type, buf) 

int gdbarch_sp_regnum(gdbarch)
register_reggroup_p (gdbarch, regnum, reggroup)
DEPRECATED_REGISTER_VIRTUAL_SIZE (reg) 
DEPRECATED_REGISTER_VIRTUAL_TYPE (reg) 
struct type *register_type (gdbarch, reg)
REGISTER_CONVERT_TO_VIRTUAL(reg, type, from, to)

 

REGISTER_CONVERT_TO_RAW(type, reg, from, to)
const struct regset *regset_from_core_section (struct gdbarch *gdbarch, const char * sect_name, size_tsect_size) 
voidgdbarch_register_to_value(gdbarch, frame, regnum, type, fur)

 

const char *gdbarch_register_name (gdbarch, regnr)

int gdbarch_stab_reg_to_regnum(gdbarch, stab_regnr) 
void gdbarch_store_return_value (gdbarch, type, regcache,valbuf)

gdbarch_ps_regnum(gdbarch  

int gdbarch_sdb_reg_to_regnum(gdbarch, sdb_regnr)

 

 


StackFrame:

SOFTWARE_SINGLE_STEP_P()

SOFTWARE_SINGLE_STEP(signal,insert_breakpoints_p)

DEPRECATED_FRAME_SAVED_PC(frame) 

CORE_ADDR gdbarch_unwind_pc(next_frame)

CORE_ADDR gdbarch_unwind_sp(gdbarch, next_frame) 

CORE_ADDR frame_align (gdbarch,address)

int gdbarch_frame_red_zone_size(gdbarch)  

DEPRECATED_FRAME_CHAIN(frame)

DEPRECATED_FRAME_CHAIN_VALID(chain,thisframe)

DEPRECATED_FRAME_INIT_SAVED_REGS(frame)

int gdbarch_frame_num_args(gdbarch, frame)

void gdbarch_extract_return_value(gdbarch, type, regbuf, valbuf)

DEPRECATED_FP_REGNUM

DEPRECATED_FRAMELESS_FUNCTION_INVOCATION(fi)

FUNCTION_EPILOGUE_SIZE

DEPRECATED_FUNCTION_START_OFFSET
int gdbarch_inner_than (gdbarch, lhs, rhs)

 

gdbarch_in_function_epilogue_p (gdbarch, addr)

 

int gdbarch_in_solib_return_trampoline (gdbarch, pc, name)

 

IN_SOLIB_DYNSYM_RESOLVE_CODE (pc)

 

SKIP_SOLIB_RESOLVER (pc) 

gdbarch_get_longjmp_target

 

TARGET_READ_SP
TARGET_READ_FP

 

void gdbarch_virtual_frame_pointer (gdbarch, pc, frame_regnum,frame_offset)
CORE_ADDR gdbarch_read_pc (gdbarch,regcache)  
gdbarch_write_pc (gdbarch, regcache, val)
DEPRECATED_USE_STRUCT_CONVENTION (gcc_p, type)
CORE_ADDR gdbarch_addr_bits_remove (gdbarch,addr)
int gdbarch_call_dummy_location (gdbarch) 
int gdbarch_cannot_fetch_register (gdbarch,regum)
int gdbarch_stabs_argument_has_addr(gdbarch, type) 
CORE_ADDR gdbarch_skip_prologue (gdbarch, ip)

 

CORE_ADDR gdbarch_skip_trampoline_code (gdbarch, frame, pc)

 

 

 

 

enum return_value_convention gdbarch_return_value (struct gdbarch*gdbarch, struct type *valtype, struct regcache *regcache, void*readbuf, const void *writebuf)

 

 

 

SAVE_DUMMY_FRAME_TOS (sp)
CORE_ADDR gdbarch_push_dummy_call (gdbarch, function, regcache,bp_addr, nargs, args, sp, struct_return, struct_addr)
CORE_ADDR gdbarch_push_dummy_code (gdbarch, sp, funaddr, using_gcc,args, nargs, value_type, real_pc, bp_addr, regcache)
DEPRECATED_REG_STRUCT_HAS_ADDR (gcc_p,type) 


 

 

 

Addresspointer:

int address_class_name_to_type_flags (gdbarch, name,type_flags_ptr)
int address_class_name_to_type_flags_p (gdbarch)
int gdbarch_address_class_type_flags (gdbarch, byte_size,dwarf2_addr_class)int gdbarch_address_class_type_flags_p(gdbarch)const char *gdbarch_address_class_type_flags_to_name(gdbarch, type_flags)
int gdbarch_address_class_type_flags_to_name_p(gdbarch) voidgdbarch_address_to_pointer (gdbarch, type, buf, addr) CORE_ADDRgdbarch_integer_to_address (gdbarch, type, buf) CORE_ADDRgdbarch_pointer_to_address (gdbarch, type, buf)

 

 

DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(regbuf) 
DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS_P()

 


Compiler and BFD:

int gdbarch_believe_pcc_promotion (gdbarch)

int gdbarch_dwarf2_reg_to_regnum(gdbarch, dwarf2_regnr)

int gdbarch_ecoff_reg_to_regnum(gdbarch, ecoff_regnr)

int gdbarch_dwarf_reg_to_regnum(gdbarch, dwarf_regnr)

GCC_COMPILED_FLAG_SYMBOL

GCC2_COMPILED_FLAG_SYMBOL

 

SOFUN_ADDRESS_MAYBE_MISSING   

PROCESS_LINENUMBER_HOOK

VARIABLES_INSIDE_BLOCK (desc,gcc_p) 

 

BreakPoint wathpoint

BREAKPOINT:定义breakpoint使用的指令,不能长于最短指令.如果采用trap则不必定义.如果才用非法指令或者其他值则必须定义TARGET_HAS_HARDWARE_WATCHPOINTS 
BIG_BREAKPOINT LITTLE_BREAKPOINT :类似BREAKPOINT, 但是用于 bi-endiantargets.const gdb_byte *gdbarch_breakpoint_from_pc (gdbarch,pcptr, lenptr) intgdbarch_memory_insert_breakpoint (gdbarch, bp_tgt)
gdbarch_memory_remove_breakpoint (gdbarch,bp_tgt)  CORE_ADDRgdbarch_adjust_breakpoint_address (gdbarchbpaddr)
I386_USE_GENERIC_WATCHPOINTS
DISABLE_UNSETTABLE_BREAK (addr) 
CORE_ADDR gdbarch_decr_pc_after_break(gdbarch) 
void gdbarch_skip_permanent_breakpoint (gdbarch,regcache) 

UserInterface
voidgdbarch_print_float_info (gdbarch, file, frame,args) 
void gdbarch_print_registers_info (gdbarch, frame, regnum,all) 
int gdbarch_print_vector_info (gdbarch, file, frame,args) 
int gdbarch_print_insn (gdbarch, vma, info)
frame_id gdbarch_unwind_dummy_id (gdbarch, frame)

 

 

Motorola M68K:

BPT_VECTOR : Define this to be the4-bit location of the breakpoint trap vector. If not defined, itwill default to 0xf.
REMOTE_BPT_VECTOR: Defaults to 1.

 

const char *gdbarch_name_of_malloc(gdbarch) A stringcontaining the name of the function to call in order to allocatesome memory in the inferior. The default value is "malloc".


Misc:
DEPRECATED_IBM6000_TARGET
SYMBOL_RELOADING_DEFAULT

转自:http://hi.baidu.com/systemsoftware/blog/item/91b7014b6d023cfe83025c70.html
原创粉丝点击