Debugging 如何在gdb中查看printf行?

Debugging 如何在gdb中查看printf行?,debugging,gdb,android-ndk,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的新手,所以需要帮助 谢谢, Ri

调试本机代码时,我写了以下几行代码:

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

直接从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)呼叫strerror(errno) 无法在0x7fff857ae897处调用函数“strerror”:没有可用的返回类型信息。 无论如何,要调用此函数,可以显式转换返回类型(例如“print(float)fabs(3.0)”) (gdb)打印(字符*)字符错误(错误号) $1=0x7fff85892565“系统调用中断” (对我来说,通常第一次调用是有效的,这是我第一次看到这个错误,所以为了完整起见,我将它包括在内。)

对于查看输出的一般问题,通常最简单的方法是在运行程序时通过重定向将程序的输出与gdb的输出分开。例如,打开一个带有“tail-f输出文件”的终端,然后执行以下操作:

(gdb) run > output-file (gdb)运行>输出文件
只需直接从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)呼叫strerror(errno) 无法在0x7fff857ae897处调用函数“strerror”:没有可用的返回类型信息。 无论如何,要调用此函数,可以显式转换返回类型(例如“print(float)fabs(3.0)”) (gdb)打印(字符*)字符错误(错误号) $1=0x7fff85892565“系统调用中断” (对我来说,通常第一次调用是有效的,这是我第一次看到这个错误,所以为了完整起见,我将它包括在内。)

对于查看输出的一般问题,通常最简单的方法是在运行程序时通过重定向将程序的输出与gdb的输出分开。例如,打开一个带有“tail-f输出文件”的终端,然后执行以下操作:

(gdb) run > output-file (gdb)运行>输出文件
您可以使用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");

您可以使用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");

这样试试。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.
#定义LOG_标签“A_标签”//要在logcat中显示的标签
#包括
LOGE(“你好世界:%s,%d”,_文件,_行);//有点像printf。
上面的代码将在logcat中打印红色的错误日志

你也可以使用

  • LOGW-警告
  • LOGD-调试
  • 后勤信息
  • LOGV-详细

    • 试试这个方法。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.
      
      #定义LOG_标签“A_标签”//要在logcat中显示的标签
      #包括
      LOGE(“你好世界:%s,%d”,_文件,_行);//有点像printf。
      
      上面的代码将在logcat中打印红色的错误日志

      你也可以使用

      • LOGW-警告
      • LOGD-调试
      • 后勤信息
      • LOGV-详细

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

          为所有级别的日志记录定义了各种其他宏。从
          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__))
          

          有较短的宏可用于登录到logcat。此示例适用于kitkat(4.4.2)

          为所有级别的日志记录定义了各种其他宏。从
          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__))
          

          @StarDust添加了一个编辑-您必须显式链接日志库。我只想添加#define选项,用
          u android_log_print
          覆盖
          printf
          ,谢谢!你真的救了我一天。:)非常感谢richq。@StarDust添加了一个编辑-您必须显式链接到日志库。我只想添加#define选项,用
          u android_log_print
          覆盖
          printf
          ,谢谢!你真的救了我一天。:)非常感谢richq。在Android的更高版本中(例如Kitkat(4.4.2)),似乎
          取代。在更高版本的Android(例如Kitkat(4.4.2))中,
          LOGx
          ALOGx
          取代,似乎
          取代。而
          LOGx
          ALOGx