diff --git a/share/qtcreator/dumper/bridge.py b/share/qtcreator/dumper/bridge.py
index edc4542bda59cd03051f6f54be3c4e0eb9db7545..da75a51e54bfe9569766414ee88d396d6ccaa682 100644
--- a/share/qtcreator/dumper/bridge.py
+++ b/share/qtcreator/dumper/bridge.py
@@ -334,8 +334,8 @@ try:
     #BitStringCode = gdb.TYPE_CODE_BITSTRING
     #ErrorTypeCode = gdb.TYPE_CODE_ERROR
     MethodCode = gdb.TYPE_CODE_METHOD
-    #MethodPointerCode = gdb.TYPE_CODE_METHODPTR
-    #MemberPointerCode = gdb.TYPE_CODE_MEMBERPTR
+    MethodPointerCode = gdb.TYPE_CODE_METHODPTR
+    MemberPointerCode = gdb.TYPE_CODE_MEMBERPTR
     ReferenceCode = gdb.TYPE_CODE_REF
     CharCode = gdb.TYPE_CODE_CHAR
     BoolCode = gdb.TYPE_CODE_BOOL
diff --git a/share/qtcreator/dumper/dumper.py b/share/qtcreator/dumper/dumper.py
index 6868183f4a129c03f256a3ca90329db04b47b283..e1a9066764e9cd26d224caed5c54db8614a47b30 100644
--- a/share/qtcreator/dumper/dumper.py
+++ b/share/qtcreator/dumper/dumper.py
@@ -1616,6 +1616,13 @@ class Dumper:
             self.putPointerValue(value.address)
             return
 
+        if type.code == MethodPointerCode or type.code == MemberPointerCode:
+            self.putType(typeName)
+            self.putAddress(value.address)
+            self.putValue(value)
+            self.putNumChild(0)
+            return
+
         if typeName.startswith("<anon"):
             # Anonymous union. We need a dummy name to distinguish
             # multiple anonymous unions in the struct.
diff --git a/tests/manual/debugger/simple/simple_test_app.cpp b/tests/manual/debugger/simple/simple_test_app.cpp
index de9f6ff5807959b8aba3c21dd48ab0712611466c..fd1041158dc2ad1ccf9af0adbb3dec1f1de7210d 100644
--- a/tests/manual/debugger/simple/simple_test_app.cpp
+++ b/tests/manual/debugger/simple/simple_test_app.cpp
@@ -4971,21 +4971,54 @@ namespace basic {
         dummyStatement(&ba);
     }
 
-    void testFunctionPointerHelper() {}
-
-    static int someData;
+    int testFunctionPointerHelper(int x) { return x; }
 
     void testFunctionPointer()
     {
-        typedef void (*func_t)();
-        func_t f2 = testFunctionPointerHelper;
-        int *p = &someData;
+        typedef int (*func_t)(int);
+        func_t f = testFunctionPointerHelper;
+        int a = f(43);
+        BREAK_HERE;
+        // CheckType f basic::func_t.
+        // Continue.
+
+        // Check there's a valid display for f.
+        dummyStatement(&f, &a);
+    }
+
+    struct Class
+    {
+        Class() : a(34) {}
+        int testFunctionPointerHelper(int x) { return x; }
+        int a;
+    };
+
+    void testMemberFunctionPointer()
+    {
+        Class x;
+        typedef int (Class::*func_t)(int);
+        func_t f = &Class::testFunctionPointerHelper;
+        int a = (x.*f)(43);
+        BREAK_HERE;
+        // CheckType f basic::func_t.
+        // Continue.
+
+        // Check there's a valid display for f.
+        dummyStatement(&f, &a);
+    }
+
+    void testMemberPointer()
+    {
+        Class x;
+        typedef int (Class::*member_t);
+        member_t m = &Class::a;
+        int a = x.*m;
         BREAK_HERE;
-        // CheckType f2 basic::func_t.
+        // CheckType m basic::member_t.
         // Continue.
 
-        // Check there's a valid display for f2.
-        dummyStatement(&f2, p);
+        // Check there's a valid display for m.
+        dummyStatement(&m, &a);
     }
 
     void testPassByReferenceHelper(Foo &f)
@@ -5139,6 +5172,8 @@ namespace basic {
         testLongEvaluation2();
         testFork();
         testFunctionPointer();
+        testMemberPointer();
+        testMemberFunctionPointer();
         testPassByReference();
         testBigInt();
         testHidden();