如何在gdb中查看printf行?

时间:2011-03-28 12:59:40

标签: debugging gdb android-ndk

在调试我的本机代码时,我写了这些代码:

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

我创建了一个套接字,但是当我执行这一行时,它返回负数。 所以我必须找到错误。但是控制台上没有显示errno和Helloworld的打印。

如何查看打印的线条?

我是ndk-gdb的新手,所以需要帮助。

谢谢, Riasat

4 个答案:

答案 0 :(得分:11)

您可以使用android日志工具代替printf:

#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

答案 1 :(得分:1)

直接从gdb中调用strerror:

(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

答案 2 :(得分:1)

试试这种方式。 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 - debug
  • LOGI - info
  • LOGV - verbose

答案 3 :(得分:0)

可以使用较短的宏来登录logcat。此示例适用于kitkat(4.4.2)

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

ALOGD("Format this %d, some_int);

在Android.mk中,在“mydroid”中构建时,将liblog库添加到LOCAL_SHARED_LIBRARIES。 (完整的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__))