This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Invalid registers



On Jul 12, 2005, at 9:13 AM, Andrew STUBBS wrote:


On Mon, 11 Jul 2005 19:47:01 +0100, Marcel Moolenaar <marcel@cup.hp.com> wrote:
Given that registers are available when a value has been supplied,
it's logical to assume (a priori) that a register is unavailable
when no value has been supplied. A register's valid "bit" allows
for this since there are 2 states that indicate unavailability:
One that indicates a temporary state (0) and one that indicates a
permanent state (-1). The initial state of a register is the temporarily
unavailable state, which triggers fetching the register from the
target. The target can change the state to permanently unavailable
or supply the value (it can also, theoretically at least, leave the
state unmodified and not provide a value). Hence, the a priori
assumption that registers are unavailable when no value has been
supplied (i.e. when the valid "bit" is not 1) seems to yield good
behaviour when implemented as such. I would say then that gdb knows
when a value is not available.

Thanks, I did look at this before I posted, but I concluded that I was not what I was looking for. I mean, how would the target know what frame you were in?

You only ask the target about the current or interrupted state (i.e. frame #0). From that you unwind to the state of the frame in question. I noticed that even in frame #0 all registers were displayed. Even if I marked some of them as unavailable. This of course affects unwinding as well. So, even though I misunderstood the context, the issues are closely related.

I do not know what it means for a register to be invalid in the target. Might it be because some registers are not available when, for example, the FPU is disabled?

Yes, that could be a possibility. On ia64, for example, the number of stacked registers is variable. gdb currently displays all 96 of them, even if the frame has only 3 stacked registers allocated. Other examples include registers that are simply not exposed through ptrace(2) or saved in core files. That is, the set of registers available to gdb may vary between operating systems. It makes sense for gdb to know about the superset, but it would be nice if it then didn't output 0 values for registers that aren't available as that may cause confusion.

BTW: this isn't a big deal, because you can debug your code anyway.
It's just (much) nicer to be able to represent reality better.

--
 Marcel Moolenaar         USPA: A-39004          marcel@xcllnt.net


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]