Skip to content

Add feature: Go to definition#402

Merged
epasveer merged 8 commits intoepasveer:mainfrom
QuangNguyenMinh123:feature/Go_to_definition
Mar 19, 2026
Merged

Add feature: Go to definition#402
epasveer merged 8 commits intoepasveer:mainfrom
QuangNguyenMinh123:feature/Go_to_definition

Conversation

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor

@QuangNguyenMinh123 QuangNguyenMinh123 commented Dec 15, 2025

This MR adds a “Go to Definition” feature, mimicking VS Code
In which, I will use 2 short cuts: "F12" and "Ctrl + left click"
image

@QuangNguyenMinh123 QuangNguyenMinh123 force-pushed the feature/Go_to_definition branch 2 times, most recently from 0a4d76c to eb6634c Compare December 20, 2025 09:06
@QuangNguyenMinh123 QuangNguyenMinh123 marked this pull request as ready for review December 20, 2025 14:29
@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

QuangNguyenMinh123 commented Dec 20, 2025

Demo: Click on any function, variable or typedef and press F12
Screencast from 20-12-2025 21:28:42.webm

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

Workflow:
When the user presses F12, the SeerEditorWidgetSourceArea reads the selected string.
The SeerEditorWidgetSourceArea passes that string to the EditorManagerWidget, which then forwards it to the GdbWidget.
At this point, we need to perform two tasks:

  1. Synchronize Seer and GDB
    This is necessary because determining the correct identifier requires Seer to perform multiple steps (these steps may not be obvious when debugging desktop applications, but they become critical when using OpenOCD). Since the GDB process and the Seer main window do not run synchronously, we need to use a mutex and condition variable to keep them in sync.

  2. Keep the GUI responsive
    To prevent the GUI from freezing, we must create a separate thread to handle all of this processing.

Screenshot from 2025-12-20 21-48-19

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

Here is the code snippet I wrote to implement the 'Go to Definition' feature for OpenOCD
Screenshot from 2025-12-20 21-57-28
Further more, debugOnInit feature will also use thread for synchronization. It is

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

Also, I will add to SeerSourceBrowserWidget:
SeerSourceBrowserWidget::findFileWithRegrex and QMap<QString,QString> _sourceFiles
They save list of source code whenever a new gdb session is created
Occasionally, -symbol-info-variables, -symbol-info-functions, and -symbol-info-types return an unrelated source file.
SeerSourceBrowserWidget::findFileWithRegex is invoked to determine whether those files should be ruled out

@epasveer
Copy link
Copy Markdown
Owner

Quite impressive! Let me go over your details.

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

@epasveer What do you think about this MR?

@epasveer
Copy link
Copy Markdown
Owner

@epasveer What do you think about this MR?

Apologies. I've been busy with the Holidays and New Years. I'll review this MR shortly.

I hope you've had a good Holidays.

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

@epasveer What do you think about this MR?

Apologies. I've been busy with the Holidays and New Years. I'll review this MR shortly.

I hope you've had a good Holidays.

My apologies. Christmas isn't typically celebrated in Vietnam, so I assumed you had forgotten about this PR 😂
You don't have to look at this right away; feel free to enjoy the holiday season. Merry Christmas! 🎄

@epasveer
Copy link
Copy Markdown
Owner

My apologies.

It's all good. I'll be back at things next week 😃

@epasveer
Copy link
Copy Markdown
Owner

Getting to this now. Sorry for the delay.

@epasveer
Copy link
Copy Markdown
Owner

Hi @QuangNguyenMinh123

I like adding this feature. My understanding is the "definition" can be a function or it can be a data type. Seer already has this ability via the "Functions" or "Types" tab in the "Source/Symbol" browser in the upper left corner. Your idea makes it much simpler, in a workflow way. Which is always good 😄

I'm a little concerned about introducing a mutex and introducing a work thread. It adds complexity.

What I would have done here is:

  1. When F12 is pressed, SeerSourceEditorAreas::handleGotoDefinition() builds a relevant string from where the cursor is currently at.

  2. Send a signal to SeerEditorManager with that string.

This is basically what you have now in your idea. Below is another idea for the rest.

SeerGdbWidget already has SeerGdbWidget::handleGdbExecutableFunctions and SeerGdbWidget::handleGdbExecutableType

Like SeerTypeBrowserWidget and SeerFunctionBrowserWidget, SeerEditorManager can emit the refreshTypeList(_id, typeSearchLineEdit->text()) and refreshFunctionList(_id, functionSearchLineEdit->text()) signals to SeerGdbWidget and parse the results and open up the file at the proper line.

Note, the text you provide from the cursor position may result in multiple occurrences of symbols or types. Have to decide how to handle this. (Open all, open none, open first). The text may match a function and a type. Again, have to decide how to handle this.

One thing to note, the refreshFunctionList() signal takes a "id". This is a unique id the widget (in this case SeerEditorManager) uses to filter out messages that are meant just for itself and not other widgets. See SeerTypeBrowserWidget as an example. It the constructor, it uses Seer::createID() to create an unique id. And the signal passes it on, then the handleText() function keys on it.

I don't see the need of a mutex, unless I'm missing something. Also, I'm not clear on what you mean by "syncronizing".

Anyway, give my idea some thought.

Oh, in your code there was a table of keywords. What are they for?

Thanks for you great ideas!

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

Hi @epasveer
"syncronizing" was probably a typo — I meant synchronizing.
I have removed the mutex and condition variable, and it seems to work well, so I'll keep them removed.
I did notice SeerGdbWidget::handleGdbExecutableFunctions and SeerGdbWidget::handleGdbExecutableType, but since I want something simpler, I created my own function instead.
I'm also concerned about cases where functions, typedefs, and variables have the same name.
So far, everything has been working smoothly. I'll create a test case that uses identical names for a function, a variable, and a typedef to see how it behaves and what can be done.
Best regards

@epasveer
Copy link
Copy Markdown
Owner

Okay. I'll review it again when you're done.

@QuangNguyenMinh123 QuangNguyenMinh123 force-pushed the feature/Go_to_definition branch 2 times, most recently from e5d47b0 to 4737044 Compare January 21, 2026 09:38
@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

@epasveer
After checking gdb mi, it seems that gdb doesn't have any solution for this
Also, I have other work that needs to be done.
I’d like to take a look at the VS Code source code sometime to see how they trace identifiers, but probably not right now.
I’ve already tested this feature together with OpenOCD on my local version, and so far it works reasonably well — mainly because we’ll never use functions, variables, and types with identical names anyway. So I’ll keep this MR open for the future.

@epasveer
Copy link
Copy Markdown
Owner

After checking gdb mi, it seems that gdb doesn't have any solution for this

Just so we're on the same page, solution for what?

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

Just so we're on the same page

For distinguishing between variable, typedef, and function identifiers:
Currently, what I’ve done is to invoke all three commands
-symbol-info-variables, -symbol-info-functions, and -symbol-info-types with the same identifier as the argument.
However, it seems that GDB MI cannot distinguish which one is a variable, function, or typedef.
Eg: If I have both a function void Test() and a struct Test, and I point to Test of void Test and press F12 to go to the definition of Test, GDB doesn’t know exactly whether Test refers to the function, the typedef/struct, or a variable. It just returns all of them. With a little bit of luck, the cursor might point to void Test; otherwise it might point to typedef or variable

@epasveer
Copy link
Copy Markdown
Owner

However, it seems that GDB MI cannot distinguish

I'm not surprised about this.

With regular gdb, one has to decide to use one of these commands up front. ie: the user knows which one to use.

(gdb) info types ^mytype
(gdb) info functions ^myfunction
(gdb) info variables ^myvariable

I don't think we can read the user's mind to know which one to use.

Perhaps, call each one, and if they result in multiple results, so be it. Open a source viewer for each one. I don't think we can do much else.

@epasveer
Copy link
Copy Markdown
Owner

Looking at your original image.

image

So this may result with this logic.

Go to Definition may mean -symbol-info-variables
Go to Declaration may mean -symbol-info-functions
Go to Type Definition may mean -symbol-info-types

@QuangNguyenMinh123 QuangNguyenMinh123 marked this pull request as draft January 27, 2026 01:51
@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

Hi @epasveer , sorry for delay
Since types, variables, and functions rarely have exactly the same name, could we just temporarily ignore this case, mark it as a known issue, and merge this MR anyway?
I use my Seer version with OpenOCD to debug embedded systems at my workplace, and I’ve actually never encountered a case where identifiers had identical names.

@epasveer
Copy link
Copy Markdown
Owner

could we just temporarily ignore this case, mark it as a known issue, and merge this MR anyway?

Sure. I'll review it again, just to be sure ("main" has other new changes) and will merge it if okay.

@QuangNguyenMinh123 QuangNguyenMinh123 force-pushed the feature/Go_to_definition branch 2 times, most recently from 82222d8 to 0eb914f Compare February 14, 2026 14:35
@QuangNguyenMinh123 QuangNguyenMinh123 marked this pull request as ready for review February 14, 2026 15:22
@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

Ready for review, please check

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

You may need to update #437 as there are likely conflicts because of #402

Sure, I'll do it when this MR is merged

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

@epasveer Your changes look good to me

@epasveer
Copy link
Copy Markdown
Owner

epasveer commented Mar 9, 2026

| will safeguard against nonsense values

I'm not sure if prefixing a "^" and postfixing a "$" to the name (which is a regex) might help eliminate the noise.

5-symbol-info-variables --name ^main$

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

QuangNguyenMinh123 commented Mar 9, 2026

I tried with you suggestion and it seems to work

I tried with add() and the ^add gives the best result
I check command ^identifier$, it shows that ^identifier$ will find exactly identifier definition. But as I checked with ^add$, it returns nothing :D

From Widget:5-symbol-info-functions --name ^add$
From GdbMonitor: 5^done,symbols={}
From GdbMonitor: (gdb) 
From Widget:5-symbol-info-functions --name ^add
From GdbMonitor: 5^done,symbols={debug=[{filename="../sysdeps/posix/getaddrinfo.c",fullname="./posix/../sysdeps/posix/getaddrinfo.c",symbols=[{line="1862",name="add_prefixlist",type="_Bool (prefixlist **, size_t *, _Bool *, char *, char *, char **)",description="static _Bool add_prefixlist(prefixlist **, size_t *, _Bool *, char *, char *, char **);"}]},{filename="./elf/dl-load.c",fullname="./elf/./elf/dl-load.c",symbols=[{line="418",name="add_name_to_object",type="void (const char *, link_map *, link_map *)",description="static void add_name_to_object(const char *, link_map *, link_map *);"},{line="2340",name="add_path",type="void (add_path_state *, unsigned int, const r_search_path_struct *, const r_search_path_struct *)",description="static void add_path(add_path_state *, unsigned int, const r_search_path_struct *, const r_search_path_struct *);"}]},{filename="./elf/dl-open.c",fullname="./elf/./elf/dl-open.c",symbols=[{line="92",name="add_to_global_resize",type="void (link_map *)",description="static void add_to_global_resize(link_map *);"},{line="81",name="add_to_global_resize_failure",type="void (link_map *, link_map *)",description="static void add_to_global_resize_failure(link_map *, link_map *);"},{line="173",name="add_to_global_update",type="void (link_map *)",description="static void add_to_global_update(link_map *);"}]},{filename="./iconv/gconv_conf.c",fullname="./iconv/./iconv/gconv_conf.c",symbols=[{line="242",name="add_module",type="void (char *, const char *, size_t, int)",description="static void add_module(char *, const char *, size_t, int);"}]},{filename="src/arithmetic.cpp",fullname="/home/quangnm/Desktop/seer/tests/recursive_test/src/arithmetic.cpp",symbols=[{line="3",name="add(int, int)",type="int (int, int)",description="int add(int, int);"}]}]}
From Widget:-break-list
From Widget:-stack-list-frames
From GdbMonitor: (gdb) 
From GdbMonitor: ^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
From GdbMonitor: (gdb) 
From GdbMonitor: ^done,stack=[frame={level="0",addr="0x000055555555a103",func="main",file="src/main.cpp",fullname="/home/quangnm/Desktop/seer/tests/recursive_test/src/main.cpp",line="86",arch="i386:x86-64"}]
From GdbMonitor: (gdb) 
From Widget:5-symbol-info-functions --name add
From GdbMonitor: 5^done,symbols={debug=[{filename="../elf/dl-tls.c",fullname="./elf/../elf/dl-tls.c",symbols=[{line="944",name="___tls_get_addr",type="void *(tls_index *)",description="void *___tls_get_addr(tls_index *);"},{line="1014",name="_dl_add_to_slotinfo",type="void (link_map *, _Bool)",description="void _dl_add_to_slotinfo(link_map *, _Bool);"},{line="969",name="_dl_tls_get_addr_soft",type="void *(link_map *)",description="void *_dl_tls_get_addr_soft(link_map *);"},{line="856",name="tls_get_addr_tail",type="void *(tls_index *, dtv_t *, link_map *)",description="static void *tls_get_addr_tail(tls_index *, dtv_t *, link_map *);"},{line="917",name="update_get_addr",type="link_map *(tls_index *)",description="static link_map *update_get_addr(tls_index *);"}]},{filename="../nss/getXXbyYY.c",fullname="./inet/../nss/getXXbyYY.c",symbols=[{line="93",name="gethostbyaddr",type="hostent *(const void *, socklen_t, int)",description="hostent *gethostbyaddr(const void *, socklen_t, int);"}]},{filename="../nss/getXXbyYY.c",fullname="./inet/../nss/getXXbyYY.c",symbols=[{line="93",name="getnetbyaddr",type="netent *(uint32_t, int)",description="netent *getnetbyaddr(uint32_t, int);"}]},{filename="../nss/getXXbyYY_r.c",fullname="./inet/../nss/getXXbyYY_r.c",symbols=[{line="187",name="__gethostbyaddr_r",type="int (const void *, socklen_t, int, hostent *, char *, size_t, hostent **, int *)",description="int __gethostbyaddr_r(const void *, socklen_t, int, hostent *, char *, size_t, hostent **, int *);"}]},{filename="../nss/getXXbyYY_r.c",fullname="./inet/../nss/getXXbyYY_r.c",symbols=[{line="187",name="__getnetbyaddr_r",type="int (uint32_t, int, netent *, char *, size_t, netent **, int *)",description="int __getnetbyaddr_r(uint32_t, int, netent *, char *, size_t, netent **, int *);"}]},{filename="../stdlib/gmp.h",fullname="./stdlib/../stdlib/gmp.h",symbols=[{line="474",name="__mpn_add",type="mp_limb_t (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)",description="mp_limb_t __mpn_add(mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);"},{line="432",name="__mpn_add_1",type="mp_limb_t (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)",description="mp_limb_t __mpn_add_1(mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);"}]},{filename="../sysdeps/ieee754/dbl-64/s_f32xaddf64.c",fullname="./math/../sysdeps/ieee754/dbl-64/s_f32xaddf64.c",symbols=[{line="26",name="__f32xaddf64",type="_Float32x (_Float64, _Float64)",description="_Float32x __f32xaddf64(_Float64, _Float64);"}]},{filename="../sysdeps/ieee754/dbl-64/s_fadd.c",fullname="./math/../sysdeps/ieee754/dbl-64/s_fadd.c",symbols=[{line="30",name="__fadd",type="float (double, double)",description="float __fadd(double, double);"}]},{filename="../sysdeps/ieee754/float128/../ldbl-128/s_daddl.c",fullname="./math/../sysdeps/ieee754/float128/../ldbl-128/s_daddl.c",symbols=[{line="32",name="__f64addf128",type="double (_Float128, _Float128)",description="double __f64addf128(_Float128, _Float128);"}]},{filename="../sysdeps/ieee754/float128/../ldbl-128/s_f64xaddf128.c",fullname="./math/../sysdeps/ieee754/float128/../ldbl-128/s_f64xaddf128.c",symbols=[{line="29",name="__f64xaddf128",type="_Float64x (_Float128, _Float128)",description="_Float64x __f64xaddf128(_Float128, _Float128);"}]},{filename="../sysdeps/ieee754/float128/../ldbl-128/s_faddl.c",fullname="./math/../sysdeps/ieee754/float128/../ldbl-128/s_faddl.c",symbols=[{line="28",name="__f32addf128",type="float (_Float128, _Float128)",description="float __f32addf128(_Float128, _Float128);"}]},{filename="../sysdeps/ieee754/ldbl-96/s_daddl.c",fullname="./math/../sysdeps/ieee754/ldbl-96/s_daddl.c",symbols=[{line="28",name="__daddl",type="double (long double, long double)",description="double __daddl(long double, long double);"}]},{filename="../sysdeps/ieee754/ldbl-96/s_faddl.c",fullname="./math/../sysdeps/ieee754/ldbl-96/s_faddl.c",symbols=[{line="26",name="__faddl",type="float (long double, long double)",description="float __faddl(long double, long double);"}]},{filename="../sysdeps/posix/getaddrinfo.c",fullname="./posix/../sysdeps/posix/getaddrinfo.c",symbols=[{line="2631",name="__GI_freeaddrinfo",type="void (addrinfo *)",description="void __GI_freeaddrinfo(addrinfo *);"},{line="2301",name="__GI_getaddrinfo",type="int (const char *, const char *, const addrinfo *, addrinfo **)",description="int __GI_getaddrinfo(const char *, const char *, const addrinfo *, addrinfo **);"},{line="1862",name="add_prefixlist",type="_Bool (prefixlist **, size_t *, _Bool *, char *, char *, char **)",description="static _Bool add_prefixlist(prefixlist **, size_t *, _Bool *, char *, char *, char **);"},{line="211",name="convert_hostent_to_gaih_addrtuple",type="_Bool (const addrinfo *, int, hostent *, gaih_result *)",description="static _Bool convert_hostent_to_gaih_addrtuple(const addrinfo *, int, hostent *, gaih_result *);"}]},{filename="../sysdeps/pthread/sem_routines.c",fullname="./nptl/../sysdeps/pthread/sem_routines.c",symbols=[{line="70",name="__sem_check_add_mapping",type="sem_t *(const char *, int, sem_t *)",description="sem_t *__sem_check_add_mapping(const char *, int, sem_t *);"}]},{filename="../sysdeps/unix/sysv/linux/ifaddrs.c",fullname="./inet/../sysdeps/unix/sysv/linux/ifaddrs.c",symbols=[{line="848",name="__GI___freeifaddrs",type="void (ifaddrs *)",description="void __GI___freeifaddrs(ifaddrs *);"},{line="832",name="__GI___getifaddrs",type="int (ifaddrs **)",description="int __GI___getifaddrs(ifaddrs **);"},{line="316",name="getifaddrs_internal",type="int (ifaddrs **)",description="static int getifaddrs_internal(ifaddrs **);"}]},{filename="../sysdeps/unix/sysv/linux/readdir64.c",fullname="./dirent/../sysdeps/unix/sysv/linux/readdir64.c",symbols=[{line="31",name="__GI___readdir64",type="dirent64 *(DIR *)",description="dirent64 *__GI___readdir64(DIR *);"}]},{filename="../sysdeps/unix/sysv/linux/readdir64.c",fullname="./dirent/../sysdeps/unix/sysv/linux/readdir64.c",symbols=[{line="31",name="__readdir64",type="dirent64 *(DIR *)",description="dirent64 *__readdir64(DIR *);"}]},{filename="../sysdeps/unix/sysv/linux/readdir64_r.c",fullname="./dirent/../sysdeps/unix/sysv/linux/readdir64_r.c",symbols=[{line="31",name="__readdir64_r",type="int (DIR *, dirent64 *, dirent64 **)",description="int __readdir64_r(DIR *, dirent64 *, dirent64 **);"}]},{filename="../sysdeps/x86_64/dl-tls.c",fullname="./elf/../sysdeps/x86_64/dl-tls.c",symbols=[{line="39",name="__tls_get_addr_slow",type="void *(tls_index *)",description="void *__tls_get_addr_slow(tls_index *);"}]},{filename="./dlfcn/dladdr.c",fullname="./dlfcn/./dlfcn/dladdr.c",symbols=[{line="24",name="__dladdr",type="int (const void *, Dl_info *)",description="int __dladdr(const void *, Dl_info *);"}]},{filename="./dlfcn/dladdr1.c",fullname="./dlfcn/./dlfcn/dladdr1.c",symbols=[{line="24",name="__dladdr1",type="int (const void *, Dl_info *, void **, int)",description="int __dladdr1(const void *, Dl_info *, void **, int);"}]},{filename="./elf/dl-addr-obj.c",fullname="./elf/./elf/dl-addr-obj.c",symbols=[{line="64",name="_dl_addr_inside_object",type="int (link_map *, const Elf64_Addr)",description="int _dl_addr_inside_object(link_map *, const Elf64_Addr);"}]},{filename="./elf/dl-addr.c",fullname="./elf/./elf/dl-addr.c",symbols=[{line="124",name="_dl_addr",type="int (const void *, Dl_info *, link_map **, const Elf64_Sym **)",description="int _dl_addr(const void *, Dl_info *, link_map **, const Elf64_Sym **);"}]},{filename="./elf/dl-load.c",fullname="./elf/./elf/dl-load.c",symbols=[{line="418",name="add_name_to_object",type="void (const char *, link_map *, link_map *)",description="static void add_name_to_object(const char *, link_map *, link_map *);"},{line="2340",name="add_path",type="void (add_path_state *, unsigned int, const r_search_path_struct *, const r_search_path_struct *)",description="static void add_path(add_path_state *, unsigned int, const r_search_path_struct *, const r_search_path_struct *);"}]},{filename="./elf/dl-object.c",fullname="./elf/./elf/dl-object.c",symbols=[{line="30",name="_dl_add_to_namespace_list",type="void (link_map *, Lmid_t)",description="void _dl_add_to_namespace_list(link_map *, Lmid_t);"}]},{filename="./elf/dl-open.c",fullname="./elf/./elf/dl-open.c",symbols=[{line="92",name="add_to_global_resize",type="void (link_map *)",description="static void add_to_global_resize(link_map *);"},{line="81",name="add_to_global_resize_failure",type="void (link_map *, link_map *)",description="static void add_to_global_resize_failure(link_map *, link_map *);"},{line="173",name="add_to_global_update",type="void (link_map *)",description="static void add_to_global_update(link_map *);"}]},{filename="./iconv/gconv_conf.c",fullname="./iconv/./iconv/gconv_conf.c",symbols=[{line="242",name="add_module",type="void (char *, const char *, size_t, int)",description="static void add_module(char *, const char *, size_t, int);"}]},{filename="./inet/inet6_rth.c",fullname="./inet/./inet/inet6_rth.c",symbols=[{line="85",name="inet6_rth_add",type="int (void *, const in6_addr *)",description="int inet6_rth_add(void *, const in6_addr *);"},{line="178",name="inet6_rth_getaddr",type="in6_addr *(const void *, int)",description="in6_addr *inet6_rth_getaddr(const void *, int);"}]},{filename="./inet/inet_mkadr.c",fullname="./inet/./inet/inet_mkadr.c",symbols=[{line="39",name="__GI___inet_makeaddr",type="in_addr (in_addr_t, in_addr_t)",description="in_addr __GI___inet_makeaddr(in_addr_t, in_addr_t);"}]},{filename="./misc/mntent_r.c",fullname="./misc/./misc/mntent_r.c",symbols=[{line="241",name="__addmntent",type="int (FILE *, const mntent *)",description="int __addmntent(FILE *, const mntent *);"}]},{filename="./nptl/nptl-stack.c",fullname="./nptl/./nptl/nptl-stack.c",symbols=[{line="41",name="__GI___nptl_stack_list_add",type="void (list_t *, list_t *)",description="void __GI___nptl_stack_list_add(list_t *, list_t *);"}]},{filename="./nptl/pthread_attr_getstackaddr.c",fullname="./nptl/./nptl/pthread_attr_getstackaddr.c",symbols=[{line="23",name="__pthread_attr_getstackaddr",type="int (const pthread_attr_t *, void **)",description="int __pthread_attr_getstackaddr(const pthread_attr_t *, void **);"}]},{filename="./nptl/pthread_attr_setstackaddr.c",fullname="./nptl/./nptl/pthread_attr_setstackaddr.c",symbols=[{line="23",name="__pthread_attr_setstackaddr",type="int (pthread_attr_t *, void *)",description="int __pthread_attr_setstackaddr(pthread_attr_t *, void *);"}]},{filename="./nscd/nscd_gethst_r.c",fullname="./nscd/./nscd/nscd_gethst_r.c",symbols=[{line="62",name="__nscd_gethostbyaddr_r",type="int (const void *, socklen_t, int, hostent *, char *, size_t, hostent **, int *)",description="int __nscd_gethostbyaddr_r(const void *, socklen_t, int, hostent *, char *, size_t, hostent **, int *);"}]},{filename="./posix/regex_internal.c",fullname="./posix/./posix/regex_internal.c",symbols=[{line="1412",name="re_dfa_add_node",type="Idx (re_dfa_t *, re_token_t)",description="static Idx re_dfa_add_node(re_dfa_t *, re_token_t);"},{line="1053",name="re_node_set_add_intersect",type="reg_errcode_t (re_node_set *, const re_node_set *, const re_node_set *)",description="static reg_errcode_t re_node_set_add_intersect(re_node_set *, const re_node_set *, const re_node_set *);"}]},{filename="./posix/spawn_faction_addchdir.c",fullname="./posix/./posix/spawn_faction_addchdir.c",symbols=[{line="26",name="posix_spawn_file_actions_addchdir_np",type="int (posix_spawn_file_actions_t *, const char *)",description="int posix_spawn_file_actions_addchdir_np(posix_spawn_file_actions_t *, const char *);"}]},{filename="./posix/spawn_faction_addclose.c",fullname="./posix/./posix/spawn_faction_addclose.c",symbols=[{line="27",name="__posix_spawn_file_actions_addclose",type="int (posix_spawn_file_actions_t *, int)",description="int __posix_spawn_file_actions_addclose(posix_spawn_file_actions_t *, int);"}]},{filename="./posix/spawn_faction_addclosefrom.c",fullname="./posix/./posix/spawn_faction_addclosefrom.c",symbols=[{line="25",name="__posix_spawn_file_actions_addclosefrom",type="int (posix_spawn_file_actions_t *, int)",description="int __posix_spawn_file_actions_addclosefrom(posix_spawn_file_actions_t *, int);"}]},{filename="./posix/spawn_faction_adddup2.c",fullname="./posix/./posix/spawn_faction_adddup2.c",symbols=[{line="27",name="__posix_spawn_file_actions_adddup2",type="int (posix_spawn_file_actions_t *, int, int)",description="int __posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *, int, int);"}]},{filename="./posix/spawn_faction_addfchdir.c",fullname="./posix/./posix/spawn_faction_addfchdir.c",symbols=[{line="26",name="posix_spawn_file_actions_addfchdir_np",type="int (posix_spawn_file_actions_t *, int)",description="int posix_spawn_file_actions_addfchdir_np(posix_spawn_file_actions_t *, int);"}]},{filename="./posix/spawn_faction_addopen.c",fullname="./posix/./posix/spawn_faction_addopen.c",symbols=[{line="28",name="__posix_spawn_file_actions_addopen",type="int (posix_spawn_file_actions_t *, int, const char *, int, mode_t)",description="int __posix_spawn_file_actions_addopen(posix_spawn_file_actions_t *, int, const char *, int, mode_t);"}]},{filename="./posix/spawn_faction_addtcsetpgrp_np.c",fullname="./posix/./posix/spawn_faction_addtcsetpgrp_np.c",symbols=[{line="25",name="__posix_spawn_file_actions_addtcsetpgrp_np",type="int (posix_spawn_file_actions_t *, int)",description="int __posix_spawn_file_actions_addtcsetpgrp_np(posix_spawn_file_actions_t *, int);"}]},{filename="./posix/wordexp.c",fullname="./posix/./posix/wordexp.c",symbols=[{line="101",name="w_addmem",type="char *(size_t, const char *, size_t *, size_t *, char *)",description="static char *w_addmem(size_t, const char *, size_t *, size_t *, char *);"},{line="127",name="w_addstr",type="char *(char *, size_t *, size_t *, const char *)",description="static char *w_addstr(char *, size_t *, size_t *, const char *);"}]},{filename="./resolv/getaddrinfo_a.c",fullname="./resolv/./resolv/getaddrinfo_a.c",symbols=[{line="37",name="__getaddrinfo_a",type="int (int, gaicb **, int, sigevent *)",description="int __getaddrinfo_a(int, gaicb **, int, sigevent *);"}]},{filename="./resolv/inet_addr.c",fullname="./resolv/./resolv/inet_addr.c",symbols=[{line="209",name="__inet_addr",type="in_addr_t (const char *)",description="in_addr_t __inet_addr(const char *);"}]},{filename="./resolv/nsap_addr.c",fullname="./resolv/./resolv/nsap_addr.c",symbols=[{line="35",name="inet_nsap_addr",type="u_int (const char *, u_char *, int)",description="u_int inet_nsap_addr(const char *, u_char *, int);"}]},{filename="./resolv/res_get_nsaddr.c",fullname="./resolv/./resolv/res_get_nsaddr.c",symbols=[{line="24",name="__GI___res_get_nsaddr",type="sockaddr *(res_state, unsigned int)",description="sockaddr *__GI___res_get_nsaddr(res_state, unsigned int);"}]},{filename="./resolv/res_hconf.c",fullname="./resolv/./resolv/res_hconf.c",symbols=[{line="355",name="_res_hconf_reorder_addrs",type="void (hostent *)",description="void _res_hconf_reorder_addrs(hostent *);"}]},{filename="./signal/sigaddset.c",fullname="./signal/./signal/sigaddset.c",symbols=[{line="25",name="__GI_sigaddset",type="int (sigset_t *, int)",description="int __GI_sigaddset(sigset_t *, int);"}]},{filename="./signal/sigsetops.c",fullname="./signal/./signal/sigsetops.c",symbols=[{line="37",name="__sigaddset_compat",type="int (__sigset_t *, int)",description="int __sigaddset_compat(__sigset_t *, int);"}]},{filename="./socket/sockaddr_un_set.c",fullname="./socket/./socket/sockaddr_un_set.c",symbols=[{line="25",name="__sockaddr_un_set",type="int (sockaddr_un *, const char *)",description="int __sockaddr_un_set(sockaddr_un *, const char *);"}]},{filename="./stdio-common/vfscanf-internal.c",fullname="./stdio-common/./stdio-common/vfscanf-internal.c",symbols=[{line="236",name="char_buffer_add_slow",type="void (char_buffer *, char)",description="static void char_buffer_add_slow(char_buffer *, char);"}]},{filename="./stdlib/fmtmsg.c",fullname="./stdlib/./stdlib/fmtmsg.c",symbols=[{line="342",name="__addseverity",type="int (int, const char *)",description="int __addseverity(int, const char *);"}]},{filename="./stdlib/setenv.c",fullname="./stdlib/./stdlib/setenv.c",symbols=[{line="116",name="__add_to_environ",type="int (const char *, const char *, const char *, int)",description="int __add_to_environ(const char *, const char *, const char *, int);"}]},{filename="./string/argz-addsep.c",fullname="./string/./string/argz-addsep.c",symbols=[{line="25",name="__argz_add_sep",type="error_t (char **, size_t *, const char *, int)",description="error_t __argz_add_sep(char **, size_t *, const char *, int);"}]},{filename="./string/argz-append.c",fullname="./string/./string/argz-append.c",symbols=[{line="44",name="__argz_add",type="error_t (char **, size_t *, const char *)",description="error_t __argz_add(char **, size_t *, const char *);"}]},{filename="./string/envz.c",fullname="./string/./string/envz.c",symbols=[{line="92",name="envz_add",type="error_t (char **, size_t *, const char *, const char *)",description="error_t envz_add(char **, size_t *, const char *, const char *);"}]},{filename="./sunrpc/get_myaddr.c",fullname="./sunrpc/./sunrpc/get_myaddr.c",symbols=[{line="56",name="__GI_get_myaddress",type="void (sockaddr_in *)",description="void __GI_get_myaddress(sockaddr_in *);"}]},{filename="./sunrpc/pmap_clnt.c",fullname="./sunrpc/./sunrpc/pmap_clnt.c",symbols=[{line="56",name="__get_myaddress",type="bool_t (sockaddr_in *)",description="static bool_t __get_myaddress(sockaddr_in *);"}]},{filename="nss_dns/dns-host.c",fullname="./resolv/nss_dns/dns-host.c",symbols=[{line="424",name="__GI__nss_dns_gethostbyaddr2_r",type="nss_status (const void *, socklen_t, int, hostent *, char *, size_t, int *, int *, int32_t *)",description="nss_status __GI__nss_dns_gethostbyaddr2_r(const void *, socklen_t, int, hostent *, char *, size_t, int *, int *, int32_t *);"},{line="566",name="__GI__nss_dns_gethostbyaddr_r",type="nss_status (const void *, socklen_t, int, hostent *, char *, size_t, int *, int *)",description="nss_status __GI__nss_dns_gethostbyaddr_r(const void *, socklen_t, int, hostent *, char *, size_t, int *, int *);"}]},{filename="nss_dns/dns-network.c",fullname="./resolv/nss_dns/dns-network.c",symbols=[{line="156",name="__GI__nss_dns_getnetbyaddr_r",type="nss_status (uint32_t, int, netent *, char *, size_t, int *, int *)",description="nss_status __GI__nss_dns_getnetbyaddr_r(uint32_t, int, netent *, char *, size_t, int *, int *);"}]},{filename="nss_files/files-hosts.c",fullname="./nss/nss_files/files-hosts.c",symbols=[{line="104",name="__GI__nss_files_gethostbyaddr_r",type="nss_status (const void *, socklen_t, int, hostent *, char *, size_t, int *, int *)",description="nss_status __GI__nss_files_gethostbyaddr_r(const void *, socklen_t, int, hostent *, char *, size_t, int *, int *);"}]},{filename="nss_files/files-network.c",fullname="./nss/nss_files/files-network.c",symbols=[{line="83",name="__GI__nss_files_getnetbyaddr_r",type="nss_status (uint32_t, int, netent *, char *, size_t, int *, int *)",description="nss_status __GI__nss_files_getnetbyaddr_r(uint32_t, int, netent *, char *, size_t, int *, int *);"}]},{filename="src/arithmetic.cpp",fullname="/home/quangnm/Desktop/seer/tests/recursive_test/src/arithmetic.cpp",symbols=[{line="3",name="add(int, int)",type="int (int, int)",description="int add(int, int);"}]}]}
From Widget:-break-list
From Widget:-stack-list-frames
From GdbMonitor: (gdb) 
From GdbMonitor: ^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
From GdbMonitor: (gdb) 
From GdbMonitor: ^done,stack=[frame={level="0",addr="0x000055555555a103",func="main",file="src/main.cpp",fullname="/home/quangnm/Desktop/seer/tests/recursive_test/src/main.cpp",line="86",arch="i386:x86-64"}]
From GdbMonitor: (gdb) 
From Widget:5-symbol-info-functions --name add$
From GdbMonitor: 5^done,symbols={debug=[{filename="../stdlib/gmp.h",fullname="./stdlib/../stdlib/gmp.h",symbols=[{line="474",name="__mpn_add",type="mp_limb_t (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)",description="mp_limb_t __mpn_add(mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);"}]},{filename="../sysdeps/ieee754/dbl-64/s_fadd.c",fullname="./math/../sysdeps/ieee754/dbl-64/s_fadd.c",symbols=[{line="30",name="__fadd",type="float (double, double)",description="float __fadd(double, double);"}]},{filename="./inet/inet6_rth.c",fullname="./inet/./inet/inet6_rth.c",symbols=[{line="85",name="inet6_rth_add",type="int (void *, const in6_addr *)",description="int inet6_rth_add(void *, const in6_addr *);"}]},{filename="./nptl/nptl-stack.c",fullname="./nptl/./nptl/nptl-stack.c",symbols=[{line="41",name="__GI___nptl_stack_list_add",type="void (list_t *, list_t *)",description="void __GI___nptl_stack_list_add(list_t *, list_t *);"}]},{filename="./string/argz-append.c",fullname="./string/./string/argz-append.c",symbols=[{line="44",name="__argz_add",type="error_t (char **, size_t *, const char *)",description="error_t __argz_add(char **, size_t *, const char *);"}]},{filename="./string/envz.c",fullname="./string/./string/envz.c",symbols=[{line="92",name="envz_add",type="error_t (char **, size_t *, const char *, const char *)",description="error_t envz_add(char **, size_t *, const char *, const char *);"}]}]}
From GdbMonitor: (gdb) 

@epasveer
Copy link
Copy Markdown
Owner

Hi,

But as I checked with ^add$, it returns nothing :D

I think that's because the symbol for add is this:

name="add(int, int)"

Full text here.

{filename="src/arithmetic.cpp",
 fullname="/home/quangnm/Desktop/seer/tests/recursive_test/src/arithmetic.cpp",
 symbols=[{line="3",name="add(int, int)",type="int (int, int)",description="int add(int, int);"}

So the regex should be something like:

^identifier\(.*\)$

For now, just add the (.*) when asking for the Function information. Leave it off for Variables and Types as they don't contain arguments like Functions do.

What I'm trying to do is eliminate the noise as much as possible early on. Asking the SeerSourceBrowserWidget if a file exists is an expensive process, especially when there are a large number of source files. So the less checks, the better.

@QuangNguyenMinh123 QuangNguyenMinh123 force-pushed the feature/Go_to_definition branch from b668207 to 3fad139 Compare March 10, 2026 16:34
@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

QuangNguyenMinh123 commented Mar 10, 2026

Your idea works.
I updated
refreshFunctionList(_idFunctionDefinition, _gotoDefIdentifier);
to
refreshFunctionList(_idFunctionDefinition, "^" + _gotoDefIdentifier + "(.*)$");
in latest commit, please have a check

@epasveer
Copy link
Copy Markdown
Owner

There was a problem in my test. It seems the symbols for my functions don't show arguments like your test does. Probably a compile/link setting.

So I made a change to look for both styles.

Can you take the latest from this PR and try your test(s) again?

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

There was a problem in my test. It seems the symbols for my functions don't show arguments like your test does. Probably a compile/link setting.

So I made a change to look for both styles.

Can you take the latest from this PR and try your test(s) again?

Excuse me, which test cases did you run? Please show me how to reproduce it

@epasveer
Copy link
Copy Markdown
Owner

Excuse me, which test cases did you run? Please show me how to reproduce it

It was:

seer/tests/hellofft

Using F12 for the print_vector, fft, and ifft functions did not take it to the definition. Debugging showed there were no arguments or braces to the function definitions.

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

QuangNguyenMinh123 commented Mar 11, 2026

It's weird
I check this test case in my laptop and it works well
I confirm that I have checked out at your latest commit
Screencast from 2026-03-11 11:31:34 PM.webm

This is gdb logout:

[23:32:00.618618] From Widget:4-symbol-info-functions --include-nondebug --name ^print_vector$
[23:32:00.619619] From Widget:4-symbol-info-functions --include-nondebug --name ^print_vector\(.*\)$
[23:32:00.619619] From Widget:5-symbol-info-variables --name print_vector
[23:32:00.6262] From Widget:6-symbol-info-types --name print_vector
[23:32:00.648648] From GdbMonitor: 4^done,symbols={debug=[{filename="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",symbols=[{line="20",name="print_vector",type="void (const char *, complex *, int)",description="static void print_vector(const char *, complex *, int);"}]}]}
[23:32:00.649649] From Widget:-break-list
[23:32:00.649649] From Widget:-stack-list-frames
[23:32:00.651651] From GdbMonitor: (gdb) 
[23:32:00.675675] From GdbMonitor: 4^done,symbols={debug=[{filename="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",symbols=[{line="20",name="print_vector",type="void (const char *, complex *, int)",description="static void print_vector(const char *, complex *, int);"}]}]}
[23:32:00.676676] From Widget:-break-list
[23:32:00.677677] From Widget:-stack-list-frames
[23:32:00.682682] From GdbMonitor: (gdb) 
[23:32:00.706706] From GdbMonitor: 5^done,symbols={}
[23:32:00.709709] From GdbMonitor: (gdb) 
[23:32:00.738738] From GdbMonitor: 6^done,symbols={}
[23:32:00.741741] From GdbMonitor: (gdb) 
[23:32:00.744744] From GdbMonitor: ^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
[23:32:00.747747] From GdbMonitor: (gdb) 
[23:32:00.748748] From GdbMonitor: ^done,stack=[frame={level="0",addr="0x000055555555594f",func="main",file="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",line="111",arch="i386:x86-64"}]
[23:32:00.749749] From GdbMonitor: (gdb) 
[23:32:00.7575] From GdbMonitor: ^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
[23:32:00.758758] From GdbMonitor: (gdb) 
[23:32:00.758758] From GdbMonitor: ^done,stack=[frame={level="0",addr="0x000055555555594f",func="main",file="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",line="111",arch="i386:x86-64"}]
[23:32:00.7676] From GdbMonitor: (gdb) 
[23:32:09.442442] From Widget:11-data-evaluate-expression "fft"
[23:32:09.446446] From GdbMonitor: 11^done,value="{void (complex *, int, complex *)} 0x555555555289 <fft>"
[23:32:09.452452] From GdbMonitor: (gdb) 
[23:32:10.161161] From Widget:11-data-evaluate-expression "v"
[23:32:10.186186] From GdbMonitor: 11^error,msg="value requires 262144 bytes, which is more than max-value-size"
[23:32:10.189189] From GdbMonitor: (gdb) 
[23:32:10.422422] From Widget:11-data-evaluate-expression "("
[23:32:10.424424] From GdbMonitor: 11^error,msg="A syntax error in expression, near `'."
[23:32:10.4343] From GdbMonitor: (gdb) 
[23:32:10.459459] From Widget:11-data-evaluate-expression "("
[23:32:10.461461] From GdbMonitor: 11^error,msg="A syntax error in expression, near `'."
[23:32:10.463463] From GdbMonitor: (gdb) 
[23:32:10.491491] From Widget:11-data-evaluate-expression "("
[23:32:10.493493] From GdbMonitor: 11^error,msg="A syntax error in expression, near `'."
[23:32:10.496496] From GdbMonitor: (gdb) 
[23:32:10.617617] From Widget:11-data-evaluate-expression "fft"
[23:32:10.6262] From GdbMonitor: 11^done,value="{void (complex *, int, complex *)} 0x555555555289 <fft>"
[23:32:10.626626] From GdbMonitor: (gdb) 
[23:32:12.155155] From Widget:4-symbol-info-functions --include-nondebug --name ^fft$
[23:32:12.156156] From Widget:4-symbol-info-functions --include-nondebug --name ^fft\(.*\)$
[23:32:12.156156] From Widget:5-symbol-info-variables --name fft
[23:32:12.157157] From Widget:6-symbol-info-types --name fft
[23:32:12.1919] From GdbMonitor: 4^done,symbols={debug=[{filename="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",symbols=[{line="48",name="fft",type="void (complex *, int, complex *)",description="void fft(complex *, int, complex *);"}]}]}
[23:32:12.191191] From Widget:-break-list
[23:32:12.192192] From Widget:-stack-list-frames
[23:32:12.193193] From GdbMonitor: (gdb) 
[23:32:12.2222] From GdbMonitor: 4^done,symbols={debug=[{filename="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",symbols=[{line="48",name="fft",type="void (complex *, int, complex *)",description="void fft(complex *, int, complex *);"}]}]}
[23:32:12.221221] From Widget:-break-list
[23:32:12.221221] From Widget:-stack-list-frames
[23:32:12.223223] From GdbMonitor: (gdb) 
[23:32:12.252252] From GdbMonitor: 5^done,symbols={}
[23:32:12.255255] From GdbMonitor: (gdb) 
[23:32:12.287287] From GdbMonitor: 6^done,symbols={}
[23:32:12.2929] From GdbMonitor: (gdb) 
[23:32:12.292292] From GdbMonitor: ^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
[23:32:12.295295] From GdbMonitor: (gdb) 
[23:32:12.295295] From GdbMonitor: ^done,stack=[frame={level="0",addr="0x000055555555594f",func="main",file="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",line="111",arch="i386:x86-64"}]
[23:32:12.297297] From GdbMonitor: (gdb) 
[23:32:12.297297] From GdbMonitor: ^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
[23:32:12.302302] From GdbMonitor: (gdb) 
[23:32:12.303303] From GdbMonitor: ^done,stack=[frame={level="0",addr="0x000055555555594f",func="main",file="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",line="111",arch="i386:x86-64"}]
[23:32:12.308308] From GdbMonitor: (gdb) 
[23:32:23.487487] From Widget:4-symbol-info-functions --include-nondebug --name ^ifft$
[23:32:23.487487] From Widget:4-symbol-info-functions --include-nondebug --name ^ifft\(.*\)$
[23:32:23.488488] From Widget:5-symbol-info-variables --name ifft
[23:32:23.488488] From Widget:6-symbol-info-types --name ifft
[23:32:23.514514] From GdbMonitor: 4^done,symbols={debug=[{filename="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",symbols=[{line="86",name="ifft",type="void (complex *, int, complex *)",description="void ifft(complex *, int, complex *);"}]}]}
[23:32:23.515515] From Widget:-break-list
[23:32:23.515515] From Widget:-stack-list-frames
[23:32:23.517517] From GdbMonitor: (gdb) 
[23:32:23.539539] From GdbMonitor: 4^done,symbols={debug=[{filename="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",symbols=[{line="86",name="ifft",type="void (complex *, int, complex *)",description="void ifft(complex *, int, complex *);"}]}]}
[23:32:23.5454] From Widget:-break-list
[23:32:23.541541] From Widget:-stack-list-frames
[23:32:23.543543] From GdbMonitor: (gdb) 
[23:32:23.563563] From GdbMonitor: 5^done,symbols={}
[23:32:23.566566] From GdbMonitor: (gdb) 
[23:32:23.598598] From GdbMonitor: 6^done,symbols={}
[23:32:23.601601] From GdbMonitor: (gdb) 
[23:32:23.604604] From GdbMonitor: ^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
[23:32:23.609609] From GdbMonitor: (gdb) 
[23:32:23.6161] From GdbMonitor: ^done,stack=[frame={level="0",addr="0x000055555555594f",func="main",file="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",line="111",arch="i386:x86-64"}]
[23:32:23.612612] From GdbMonitor: (gdb) 
[23:32:23.612612] From GdbMonitor: ^done,BreakpointTable={nr_rows="0",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[]}
[23:32:23.616616] From GdbMonitor: (gdb) 
[23:32:23.617617] From GdbMonitor: ^done,stack=[frame={level="0",addr="0x000055555555594f",func="main",file="hellofft.c",fullname="/home/quangnm/Desktop/seer/tests/hellofft/hellofft.c",line="111",arch="i386:x86-64"}]
[23:32:23.618618] From GdbMonitor: (gdb) 

@epasveer
Copy link
Copy Markdown
Owner

Hi,

Okay, this tells me you got my latest fix. And it works for my case.

[23:32:12.155155] From Widget:4-symbol-info-functions --include-nondebug --name ^fft$
[23:32:12.156156] From Widget:4-symbol-info-functions --include-nondebug --name ^fft\(.*\)$
[23:32:12.156156] From Widget:5-symbol-info-variables --name fft
[23:32:12.157157] From Widget:6-symbol-info-types --name fft

Does it work for your test case(s)?

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

It works with my test case.
however, I think that you should keep only one 4-symbol-info-functions --include-nondebug --name, either ^fft$ or ^fft(.*)$

@epasveer
Copy link
Copy Markdown
Owner

however, I think that you should keep only one

I'd like to but I don't think I can. Your tests require one method. My tests require the other.

It likely boils down to how the source files are compiled and linked, perhaps even what compiler.

We can't ask the users to do anything so I think we need to make both calls.

@epasveer
Copy link
Copy Markdown
Owner

epasveer commented Mar 13, 2026

I've made one more changes. Because we now use exact definitions with ^function$ and ^function(.*), I see no need to verify against the source list in SeerSourceBrowserWidget.

I've removed that check (and code) and it works for my tests. Can you try your test again.

If it works, I'll pull this MR.

@epasveer
Copy link
Copy Markdown
Owner

Hi @QuangNguyenMinh123

I've removed that check (and code) and it works for my tests. Can you try your test again.

Can you try your tests with this latest MR when you have time?

// Searching for: "^functionName$".
//

emit refreshFunctionList(_idFunctionDefinition, "^" + _gotoDefIdentifier + "$");
Copy link
Copy Markdown
Contributor Author

@QuangNguyenMinh123 QuangNguyenMinh123 Mar 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’ve tried your changes, but this signal returns nothing in my test case, so I think we can remove this line.
I've tried to removing this line, and everything works fine
I’m not sure which test case you used, but if this line works for that test case, then we could keep it

@QuangNguyenMinh123
Copy link
Copy Markdown
Contributor Author

QuangNguyenMinh123 commented Mar 18, 2026

I see you removed _sourceBrowserWidget and findFileWithRegex.
These might not be useful right now, but they will be when it comes to debugging the Linux kernel, where the source code is massive
We'll discuss this further in another MR
Apart from that, everything looks good to me

@epasveer
Copy link
Copy Markdown
Owner

I see you removed _sourceBrowserWidget and findFileWithRegex.
These might not be useful right now, but they will be when it comes to debugging the Linux kernel, where the source code
is massive. We'll discuss this further in another MR

Yeah, I did remove it. I didn't think it was needed at this point. If, as you point out, it would help with debugging the Linux kernel, we can revisit it then.

1 similar comment
@epasveer
Copy link
Copy Markdown
Owner

I see you removed _sourceBrowserWidget and findFileWithRegex.
These might not be useful right now, but they will be when it comes to debugging the Linux kernel, where the source code
is massive. We'll discuss this further in another MR

Yeah, I did remove it. I didn't think it was needed at this point. If, as you point out, it would help with debugging the Linux kernel, we can revisit it then.

@epasveer
Copy link
Copy Markdown
Owner

I’m not sure which test case you used, but if this line works for that test case, then we could keep it

It is needed for my test case. So we need to keep it.

@epasveer
Copy link
Copy Markdown
Owner

Apart from that, everything looks good to me

Okay. Cool. I'll pull this MR.

@epasveer epasveer merged commit 872f578 into epasveer:main Mar 19, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants