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