如何在gdb中形成字符串并打印它。我的格式字符串保存在一个单独的数组中,params保存在一个单独的结构数组中。
char * formateStr[]
struct msgs[]
{
int formateId;
int param1;
int param2;
int param3;
int param4;
}
在c中,我可以使用printf
打印msg而没有任何问题printf(formateStr[msg[1].formateStrId],msg[1].param1,msg[2].param2,...);
当我尝试在gdb中执行相同操作时,我收到以下错误
(gdb) printf formateStr[msg[1].formateStrId],msg[1].param1,msg[2].param2,...
Bad format string, missing '"'.
后来我开始在c
中寻找与snprint相当的东西snprintf(msg , formateStr[msg[1].formateStrId],msg[1].param1,msg[2].param2,...);
printf("%s", msg);
但无法找到任何答案。我怎样才能在gdb中实现这个目标?
答案 0 :(得分:0)
在c中,我可以通过使用printf来打印msg而没有任何问题 当我尝试在gdb中执行相同操作时出现以下错误
你没有在GDB中做同样的事情。在GDB中执行相同操作将如下所示:
(gdb) call printf(formateStr[msg[1].formateStrId],msg[1].param1,msg[2].param2,...)
您正在做的是调用GDB的内置printf
命令。该命令expects字符串文字作为格式,因此您无法将其传递给变量,并在尝试时出错。
P.S。 format
通常拼写为e
。
答案 1 :(得分:0)
如果您能够在实时流程中调用函数,@ EmployedRussian的答案是最好的方法。
如果没有,在大多数情况下,您可以使用gdb' eval
命令构造并运行printf
命令,并将其所需的字符串文字作为其第一个参数:
(gdb) list
1 char *formateStr[1] = { "address is %d.%d.%d.%d\n" };
2 struct {
3 int formateStrId;
4 int param1;
5 int param2;
6 int param3;
7 int param4;
8 } msg[1] = { 0, 192, 168, 0, 1 };
9
10 int main(void)
(gdb) set $fmt=formateStr[msg[0].formateStrId]
(gdb) print $fmt
$2 = 0x80484b0 "address is %d.%d.%d.%d\n"
(gdb) eval "printf \"%s\", msg[0].param1, msg[0].param2, msg[0].param3, msg[0].param4", $fmt
address is 192.168.0.1
如果格式字符串包含双引号,则在使用该eval命令之前,您需要更改它以添加反斜杠,将每\"
更改为\\\"
。