интерпретация трассировки стека приложения с использованием mdb - PullRequest
0 голосов
/ 06 марта 2012

Может кто-нибудь помочь мне с созданием этой трассировки стека:

        Loading modules: [ libumem.so.1 libc.so.1 libuutil.so.1 ld.so.1 ]
        > $c
        libc.so.1`strlen+0xc(80b37ba, fe679d2c, fe679d00, 0)
        libc.so.1`snprintf+0x74(fe67d970, 1388, 80b37b8, efef9f68, 80b379d, fe679e30)
        > 80b37ba::whatis
        80b37ba is unknown
        > fe679d2c::whatis
        fe679d2c is unknown
        > fe679d00::whatis
        fe679d00 is unknown

Функция strlen получает один аргумент, но в этой трассировке стека я вижу 3 адреса? В чем их смысл?

привет

1 Ответ

1 голос
/ 06 марта 2012

Отладчику не удается интерпретировать большую часть этого.

Отладчик может не знать, сколько параметров получает функция. Так что печатает больше. Но вы можете игнорировать дополнительные параметры.

Части, которые действительно имеют смысл, показывают, что snprintf был вызван, а затем вызывают strlen. Вероятно, это связано с %s в строке формата. Параметр strlen аналогичен (не идентичен, я не знаю почему) третьему параметру snprintf.
Так что, вероятно, некоторый код делает что-то вроде snprintf("%d %s\n", number, string).
Вы можете найти фактическую строку формата в fe67d970, и это, вероятно, позволит вам определить, кто ее вызвал (если вы не используете везде одинаковую строку формата).

...