How to print details of dns_name_t* when hitting a gdb breakpoint in dns_name_equal

Kees Bakker keesb at ghs.com
Wed Dec 4 16:31:46 UTC 2024


On 03-12-2024 15:56, Petr Špaček wrote:
> On 03. 12. 24 11:36, Kees Bakker via bind-users wrote:
>> I have a CentOS FreeIPA setup with with multiple named (bind9 9.16.23)
>> servers.
>> On two of my five servers, when I start named it fails a REQUIRE in
>> dns_name_equal
>>
>>      /*
>>       * Either name1 is absolute and name2 is absolute, or neither is.
>>       */
>>      REQUIRE((name1->attributes & DNS_NAMEATTR_ABSOLUTE) ==
>>          (name2->attributes & DNS_NAMEATTR_ABSOLUTE));
>>
>> My question: if I run gdb and break in "assertion_failed", then "go up",
>> how can I print name1 and name2 in a meaningful manner,
>> so that I can figure out what entries are causing this failure?
>>
>> Just doing "p *name1" in gdb isn't very helpful for that.
>
> Many years ago I wrote
> https://github.com/pspacek/bind-gdb-pretty-printers
> to help with this problem. I have no idea if it still works, but it
> might be worth a try, given the ancient version you are running!
Thanks
I got that to work after some refactoring gen_json_dict.py (I'll send
it to your Github)
I see that the pretty printers can help displaying dns_name_t variables.

Unfortunately, I still can't make heads or tails from the name1 and name2
at the moment of the crash.

[Switching to Thread 0x7fffef88e640 (LWP 322823)]

Thread 2.13 "isc-net-0011" hit Breakpoint 1, assertion_failed 
(file=0x7ffff7dd4ffe "../../../lib/dns/name.c", line=668,
     type=isc_assertiontype_require, cond=0x7ffff7dd5770 
"(name1->attributes & 0x00000001) == (name2->attributes & 0x00000001)")
     at ../../../bin/named/main.c:208
208                      const char *cond) {
(gdb) up
#1  0x00007ffff7e9a4e0 in isc_assertion_failed 
(file=file at entry=0x7ffff7dd4ffe "../../../lib/dns/name.c", 
line=line at entry=668,
     type=type at entry=isc_assertiontype_require,
     cond=cond at entry=0x7ffff7dd5770 "(name1->attributes & 0x00000001) == 
(name2->attributes & 0x00000001)")
     at ../../../lib/isc/assertions.c:46
46              isc_assertion_failed_cb(file, line, type, cond);
(gdb)
#2  0x00007ffff7c9fb4a in dns_name_equal (name1=<optimized out>, 
name2=<optimized out>) at ../../../lib/dns/name.c:668
668             REQUIRE((name1->attributes & DNS_NAMEATTR_ABSOLUTE) ==
(gdb)
#3  0x00007ffff7cb4adc in match (name2=0x7fffd8650010, 
name1=0x7fffd806fca0) at ../../../lib/dns/order.c:96
96              return (dns_name_equal(name1, name2));
(gdb) p *name1
$10 = {magic = 1145983854, ndata = 0x7fffd8066010 "", length = 0, labels 
= 0, attributes = 0, offsets = 0x7fffd806fcf8 "",
   buffer = 0x0, link = {prev = 0x0, next = 0x0}, list = {head = 
0x7fffd8073a90, tail = 0x7fffd8073a90}, ht = 0x0}
(gdb) p *name2
$11 = {magic = 1145983854, ndata = 0x7fffd8650128 "", length = 1, labels 
= 1, attributes = 1, offsets = 0x7fffd8650068 "",
   buffer = 0x7fffd86500e8, link = {prev = 0xffffffffffffffff, next = 
0xffffffffffffffff}, list = {head = 0x0, tail = 0x0}, ht = 0x0}

>
>> BTW My work around is to keep restarting named until it no longer fails
>> on that REQUIRE.
>>
>> Any help is greatly appreciated.
>
> I'm the guy was responsible for (re)designing FreeIPA DNS integration
> with BIND between 2012-2016, so I can only repeat what I said to my
> superiors before I left FreeIPA project & Red Hat:
>
> The whole bind-dyndb-ldap thing needs to be redesigned from ground up
> and properly integrated with BIND (or some other server) via clean APIs
> instead of poking at BIND guts at run-time.
>
> If you or anyone else is interested in making this possible please
> contribute to design discussion in
> https://gitlab.isc.org/isc-projects/bind9/-/issues/661
> so we can add proper APIs to BIND.
>
> -- 
> Petr Špaček
> Internet Systems Consortium



More information about the bind-users mailing list