Как увидеть строки printf в GDB? - PullRequest
1 голос
/ 28 марта 2011

При отладке собственного кода я написал следующие строки:

m_sock = socket(m_iAf, m_iType, m_iProtocol);
printf("errno = %d, %s\n", errno, strerror(errno));
printf("Hellowrold\n");

Я создал сокет, но когда я выполняю эту строку, он возвращает отрицательный результат.Поэтому я должен найти ошибку.Но на консоли не отображается ни errno, ни Helloworld.

Как мне увидеть напечатанные строки?

Я новичок в ndk-gdb, поэтому нужна помощь, пожалуйста.

Спасибо, Риасат

Ответы [ 4 ]

11 голосов
/ 28 марта 2011

Вместо printf вы можете использовать функцию ведения журнала для Android:

#include <android/log.h>

__android_log_print(ANDROID_LOG_INFO, "MYPROG", "errno = %d, %s", errno, strerror(errno));
__android_log_print(ANDROID_LOG_INFO, "MYPROG", "Hellowrold");

Нет необходимости в конце "\ n" здесь, и они будут отображаться в logcat.Вам также необходимо указать ссылку на библиотеку журналов.В своем файле Android.mk добавьте следующее:

LOCAL_LDLIBS := -llog
2 голосов
/ 28 марта 2011

Просто вызовите strerror напрямую из GDB:

(gdb) call strerror( errno )
Unable to call function "strerror" at 0x7fff857ae897: no return type information available.
To call this function anyway, you can cast the return type explicitly (e.g. 'print (float) fabs (3.0)')
(gdb) print (char *) strerror( errno )
$1 = 0x7fff85892565 "Interrupted system call"

(Для меня обычно первый вызов работает, и я впервые вижу эту ошибку, поэтому я включил ее для полноты.)

Что касается общего вопроса о просмотре вывода, обычно проще всего отделить вывод программы от вывода GDB путем перенаправления при запуске программы. Например, откройте один терминал с помощью «tail -f output-file», а затем выполните:

(gdb) run > output-file
1 голос
/ 20 апреля 2011

Попробуйте так.Android cpp source печатает журнал таким образом.

#define LOG_TAG "A_TAG" // the tag to be shown in logcat
#include <utils/Log.h> 
LOGE("Hello world: %s,%d",__FILE__,__LINE__);  // somewhat like printf.

Приведенный выше код напечатает журнал ошибок красным цветом в logcat.

Вы также можете использовать

  • LOGW - предупреждение
  • LOGD - отладка
  • LOGI - информация
  • LOGV - подробный
0 голосов
/ 31 марта 2015

Для входа в logcat доступны более короткие макросы.Этот пример работает в kitkat (4.4.2)

#define LOG_TAG "my_log_tag"
#include <cutils/log.h>

ALOGD("Format this %d, some_int);

В Android.mk добавьте библиотеку liblog в LOCAL_SHARED_LIBRARIES при сборке в 'mydroid' (полная сборка системы Android).В случае ndk build можно использовать LOCAL_LDLIBS: = -L $ (SYSROOT) / usr / lib -llog.

include $(CLEAR_VARS)
LOCAL_MODULE    := foo
LOCAL_SRC_FILES := foo.c
# if mydroid
LOCAL_SHARED_LIBRARIES := liblog
# in ndk, use LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog instead
include $(BUILD_EXECUTABLE)

Существуют различные другие макросы, определенные для всех уровней ведения журнала.От cutils/log.h:

#define ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
#define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
...
#define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
...