Skip to contentSkip to conversation

scripts/gdb: fix lx-version for gdb 7.3-

PATCH Superseded Du Changbin 3 participants 4 messages Oct 17, 2018 GDB kernel debugging helper scripts

v1 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 scripts/gdb: fix lx-version for gdb 7.3-

For gdb version less than 7.3, lx-version only one character. (gdb) lx-version
L(gdb)

This can be fixed by casting 'linux_banner' as (char *).
(gdb) lx-version
Linux version 4.19.0-rc1+ (changbin@acer) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21 SMP Sat Sep 1 21:43:30 CST 2018

gdb 7.4 seems to be no such issue.

---
 scripts/gdb/linux/proc.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/gdb/linux/proc.py +1 -1
index 086d27223c0c..0aebd7565b03 100644
@@ -41,7 +41,7 @@ class LxVersion(gdb.Command):
 
     def invoke(self, arg, from_tty):
         # linux_banner should contain a newline
-        gdb.write(gdb.parse_and_eval("linux_banner").string())
+        gdb.write(gdb.parse_and_eval("(char *)linux_banner").string())
 
 LxVersion()
 
Signature · 1 line
2.17.1
maintainer
#1 lore raw
Quoted 1 line · Du Changbin

For gdb version less than 7.3, lx-version only one character.

                                          ^^^ prints?
Quoted 20 lines

(gdb) lx-version
L(gdb)

This can be fixed by casting 'linux_banner' as (char *).
(gdb) lx-version
Linux version 4.19.0-rc1+ (changbin@acer) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21 SMP Sat Sep 1 21:43:30 CST 2018

gdb 7.4 seems to be no such issue.

---
  scripts/gdb/linux/proc.py | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
scripts/gdb/linux/proc.py +0 -0
index 086d27223c0c..0aebd7565b03 100644

scripts/gdb/linux/proc.py class LxVersion(gdb.Command): · line 47

Quoted 8 lines
scripts/gdb/linux/proc.py +1 -1
@@ -41,7 +41,7 @@ class LxVersion(gdb.Command):
 
      def invoke(self, arg, from_tty):
          # linux_banner should contain a newline
-        gdb.write(gdb.parse_and_eval("linux_banner").string())
+        gdb.write(gdb.parse_and_eval("(char *)linux_banner").string())
 
  LxVersion()
 

Looks good to me otherwise.

Jan

Signature · 2 lines
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux
#2 lore raw
Quoted 5 lines · Jan Kiszka
Quoted 1 line · Du Changbin

For gdb version less than 7.3, lx-version only one character.

                                          ^^^ prints?

I will update it, thanks!

Quoted 28 lines
Quoted 19 lines

(gdb) lx-version
L(gdb)

This can be fixed by casting 'linux_banner' as (char *).
(gdb) lx-version
Linux version 4.19.0-rc1+ (changbin@acer) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21 SMP Sat Sep 1 21:43:30 CST 2018

gdb 7.4 seems to be no such issue.

---
  scripts/gdb/linux/proc.py | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
scripts/gdb/linux/proc.py +0 -0
index 086d27223c0c..0aebd7565b03 100644

scripts/gdb/linux/proc.py class LxVersion(gdb.Command): · line 45

Quoted 6 lines
scripts/gdb/linux/proc.py +1 -1
@@ -41,7 +41,7 @@ class LxVersion(gdb.Command):
      def invoke(self, arg, from_tty):
          # linux_banner should contain a newline
-        gdb.write(gdb.parse_and_eval("linux_banner").string())
+        gdb.write(gdb.parse_and_eval("(char *)linux_banner").string())
  LxVersion()
 

Looks good to me otherwise.

Quoted 5 lines

Jan

--
Siemens AG, Corporate Technology, CT RDA IOT SES-DE Corporate Competence Center Embedded Linux

--
Thanks,
Du Changbin

Reviewed-by on v1 1/1
#3 lore raw
In reply to Du Changbin

Hi Du,

Quoted 20 lines · Du Changbin

For gdb version less than 7.3, lx-version only one character. (gdb) lx-version
L(gdb)

This can be fixed by casting 'linux_banner' as (char *).
(gdb) lx-version
Linux version 4.19.0-rc1+ (changbin@acer) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21 SMP Sat Sep 1 21:43:30 CST 2018

gdb 7.4 seems to be no such issue.

---
 scripts/gdb/linux/proc.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/gdb/linux/proc.py +0 -0
index 086d27223c0c..0aebd7565b03 100644

scripts/gdb/linux/proc.py class LxVersion(gdb.Command): · line 44

Quoted 5 lines
scripts/gdb/linux/proc.py +1 -1
@@ -41,7 +41,7 @@ class LxVersion(gdb.Command):
 
     def invoke(self, arg, from_tty):
         # linux_banner should contain a newline
-        gdb.write(gdb.parse_and_eval("linux_banner").string())
+        gdb.write(gdb.parse_and_eval("(char *)linux_banner").string())

Interesting - this is an issue I reported to the GDB team after I'd tried to dig into the fault.

https://sourceware.org/bugzilla/show_bug.cgi?id=20077

the parse_and_eval finds a string length of 0, but then later in the GBD parsing it gets incremented to 1, hence the single char. I guess it's some failure in GDB determining the type of the pointer.

However, from reading the bugzilla entry and from what I recall - it only occurred if you had done a backtrace before calling lx-version.

Did you discover that it would always return only the single character in your testing ? Even if it was the first command executed?

My worry is - that if this fixes lx-version - do we also need to manually cast lx-cmdline as well ? (I never saw the issue occur on that cmd).

I think considering the age of the bugzilla at GDB, and the lack of any GDB level fix or understanding - we should certainly apply this fix here
- and probably include it in the stable trees too.

With the title fix as highlighted by Jan,

Would you be able to test the issue with the lx-cmdline command as well please? And if it is suffering the same issue - perhaps you could either submit a second patch to update that entry - or respin this one to include both?

Quoted 4 lines
scripts/gdb/linux/proc.py +0 -0
 LxVersion()
 
 
Signature · 3 lines
Regards
--
Kieran