Dan Lukes wrote on 02/25/2016 17:59:
Miroslav Lachman wrote:
Konecne jsem se dostal k tomu, abych si to zkompiloval v poudriere s
WITH_DEBUG=yes. Nainstaloval na zkusebni stroj a ted jsem z core dostal
tohle
(gdb) bt
#0 0x0000000000405c26 in BoolString::operator= (this=0x802816130,
other=@0x7fffffffdc40)
at BoolString.h:58
#1 0x000000000040291a in submit_query (ads=0x802817400,
reslist=@0x7fffffffe1a0,
lp=0x8028bc080) at dns-terror.cc:347
#2 0x0000000000404870 in main (argc=6, argv=0x7fffffffe690) at
dns-terror.cc:763
Ale tohle uz je pro me spanelska vesnice a nic mi to nerika.
Takze nejdriv "kde":
K chybe doslo v kodu co byl vygenerovan z radku 58 v BoolString.h,
kteryzto kod byl zavolan z funkce submit_query, radku 347 v
dns-terror.cc, ktery byl volan z funkce main, radek 763 tehoz zdrojoveho
souboru.
A ted co:
Program terminated with signal 4, Illegal instruction.
V prelozenem kodu je instrukce, ktere konkretni procesor nerozumi.
Takze zrejme jde o chybu pri prekladu - kod je prelozen pro jiny
procesor nez na jakem nasledne bezi.
Je to kompilovano na amd64 a spousteno taky na amd64. Fyzicky se jedna o
kompilaci na Xeon E3-1240v2 a spousteni na nejakem starsim dual core
Opteronu (Sun Fire X2100 M2). Nicmene dns-terror pada i kdyz ho spoustim
primo na Xeon E3-1240v2
[...]
Zustanem u te prvni moznosti.
Ten kod v BoolString.h je celkem trivialni prirazeni. Takze bude treba dat:
"set disassembly-flavor intel" (ledaze preferujes defaultni att) a
disassembly 0x405c26
Ono to vypise vysledek prekladu od zacatku te funkce. U me ale na adrese
405c26 instrukce nezacina, takze je zrejmy, ze ja mam prelozeno jinak
(jina verze OS, jina verze prekladace, jine nastaveni systemu, jina
uroce optimalizace pri prekladu, ...).
To by mohlo podezreni potvrdit nebo vyvratit.
Tady jsem dostal tohle
(gdb) set disassembly-flavor intel
(gdb) disassembly 0x405c26
Undefined command: "disassembly". Try "help".
(gdb) disassemble 0x405c26
Dump of assembler code for function _ZN10BoolStringaSERKS_:
0x0000000000405c00 <_ZN10BoolStringaSERKS_+0>: push rbp
0x0000000000405c01 <_ZN10BoolStringaSERKS_+1>: mov rbp,rsp
0x0000000000405c04 <_ZN10BoolStringaSERKS_+4>: mov QWORD PTR
[rbp-0x10],rdi
0x0000000000405c08 <_ZN10BoolStringaSERKS_+8>: mov QWORD PTR
[rbp-0x18],rsi
0x0000000000405c0c <_ZN10BoolStringaSERKS_+12>: mov rsi,QWORD PTR
[rbp-0x10]
0x0000000000405c10 <_ZN10BoolStringaSERKS_+16>: mov rdi,QWORD PTR
[rbp-0x18]
0x0000000000405c14 <_ZN10BoolStringaSERKS_+20>: mov rdi,QWORD PTR [rdi]
0x0000000000405c17 <_ZN10BoolStringaSERKS_+23>: mov QWORD PTR [rsi],rdi
0x0000000000405c1a <_ZN10BoolStringaSERKS_+26>: mov rdi,QWORD PTR
[rbp-0x18]
0x0000000000405c1e <_ZN10BoolStringaSERKS_+30>: mov al,BYTE PTR [rdi+0x8]
0x0000000000405c21 <_ZN10BoolStringaSERKS_+33>: and al,0x1
0x0000000000405c23 <_ZN10BoolStringaSERKS_+35>: mov BYTE PTR [rsi+0x8],al
0x0000000000405c26 <_ZN10BoolStringaSERKS_+38>: ud2a
End of assembler dump.
Mimochodem, dotceneho mista se tyka warning uz pri prekladu:
./BoolString.h:59:3: warning: control reaches end of non-void function
[-Wreturn-type]
}
^
To by pad zpusobit nemelo, ale faktem je, ze funkce ma vracet hodnotu a
pritom se navratova hodnota nenastavuje. Je pravda, ze v pripade
optimalizaci by to mohlo zpusobit, ze oprimalizator nejaky potrebny kod
vyradi, protoze ho bude pokladat za zbytecny. To ale tezko rict ...
Da se z toho vyzdimat jeste nejaka uzitecna informace? Pripadne da se
"neco" zkusit upravit pri te kompilaci, aby to fungovalo? Nebo tohle uz
musim jedine poslat autorovi fastresolve, at si s tim zkusi poradit?
Kazdopadne diky za cenne rady a instrukce!
Mirek
--
FreeBSD mailing list (users-l@freebsd.cz)
http://www.freebsd.cz/listserv/listinfo/users-l