
Hello, I want to add a field for collecting information about the number of GCs a particular heap object survived. I've done the following to implement this: - Add a field "StgWord gc_id" to struct "StgHeader" and "StgThunkHeader" - Update "SET_HDR" macro in "ClosureMacros.h" to update the "gc_id" - Update the "closureTypeHeaderSize" function in "Heap/ClosureTypes.hs" to account for that 1 extra word. Compilation leads to a segmentation fault. The stage 2 compiler is built. But usage of it leads to a segmentation fault. Build output: ``` chmod +x inplace/bin/ghc-stage2 "inplace/bin/ghc-stage2" -hisuf dyn_hi -osuf dyn_o -hcsuf dyn_hc -fPIC -dynamic -O0 -H64m -Wall -hide-all-packages -package-env - -i -iutils/check-api-annotations/. -iutils/check-api-annotations/dist-install/build -Iutils/check-api-annotations/dist-install/build -iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -Iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -optP-include -optPutils/check-api-annotations/dist-install/build/check-api-annotations/autogen/cabal_macros.h -package-id Cabal-3.2.1.0 -package-id base-4.14.3.0 -package-id containers-0.6.5.1 -package-id directory-1.3.6.0 -package-id ghc-8.10.7.20240224 -Wall -XHaskell2010 -no-user-package-db -rtsopts -Wnoncanonical-monad-instances -outputdir utils/check-api-annotations/dist-install/build -c utils/check-api-annotations/./Main.hs -o utils/check-api-annotations/dist-install/build/Main.dyn_o utils/check-api-annotations/ghc.mk:18: recipe for target 'utils/check-api-annotations/dist-install/build/Main.dyn_o' failed make[1]: *** [utils/check-api-annotations/dist-install/build/Main.dyn_o] Segmentation fault (core dumped) Makefile:123: recipe for target 'all' failed make: *** [all] Error 2 ``` Is there any other place I've missed follow-up modifications? I appreciate any help provided. Best, Adithya

Hi,
Are you using profiling mode?
Regards,
Csaba
On Sun, Feb 25, 2024 at 1:59 PM Adithya Kumar
Hello,
I want to add a field for collecting information about the number of GCs a particular heap object survived.
I've done the following to implement this: - Add a field "StgWord gc_id" to struct "StgHeader" and "StgThunkHeader" - Update "SET_HDR" macro in "ClosureMacros.h" to update the "gc_id" - Update the "closureTypeHeaderSize" function in "Heap/ClosureTypes.hs" to account for that 1 extra word.
Compilation leads to a segmentation fault. The stage 2 compiler is built. But usage of it leads to a segmentation fault.
Build output: ``` chmod +x inplace/bin/ghc-stage2 "inplace/bin/ghc-stage2" -hisuf dyn_hi -osuf dyn_o -hcsuf dyn_hc -fPIC -dynamic -O0 -H64m -Wall -hide-all-packages -package-env - -i -iutils/check-api-annotations/. -iutils/check-api-annotations/dist-install/build -Iutils/check-api-annotations/dist-install/build -iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -Iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -optP-include -optPutils/check-api-annotations/dist-install/build/check-api-annotations/autogen/cabal_macros.h -package-id Cabal-3.2.1.0 -package-id base-4.14.3.0 -package-id containers-0.6.5.1 -package-id directory-1.3.6.0 -package-id ghc-8.10.7.20240224 -Wall -XHaskell2010 -no-user-package-db -rtsopts -Wnoncanonical-monad-instances -outputdir utils/check-api-annotations/dist-install/build -c utils/check-api-annotations/./Main.hs -o utils/check-api-annotations/dist-install/build/Main.dyn_o utils/check-api-annotations/ghc.mk:18: recipe for target 'utils/check-api-annotations/dist-install/build/Main.dyn_o' failed make[1]: *** [utils/check-api-annotations/dist-install/build/Main.dyn_o] Segmentation fault (core dumped) Makefile:123: recipe for target 'all' failed make: *** [all] Error 2 ```
Is there any other place I've missed follow-up modifications?
I appreciate any help provided.
Best, Adithya _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Hi Adithya,
It seems that eras profiling mode allows you to determine this information.
In eras profiling the era the object is created is stored in the profiling
header, you can automatically increment the era with the
--automatic-era-increment at each major collection, you can work out "how
many collections an object has been live" by subtracting the current era
from the era the object was created.
Cheers,
Matt
On Sun, 25 Feb 2024, 15:43 Csaba Hruska,
Hi, Are you using profiling mode? Regards, Csaba
On Sun, Feb 25, 2024 at 1:59 PM Adithya Kumar
wrote: Hello,
I want to add a field for collecting information about the number of GCs a particular heap object survived.
I've done the following to implement this: - Add a field "StgWord gc_id" to struct "StgHeader" and "StgThunkHeader" - Update "SET_HDR" macro in "ClosureMacros.h" to update the "gc_id" - Update the "closureTypeHeaderSize" function in "Heap/ClosureTypes.hs" to account for that 1 extra word.
Compilation leads to a segmentation fault. The stage 2 compiler is built. But usage of it leads to a segmentation fault.
Build output: ``` chmod +x inplace/bin/ghc-stage2 "inplace/bin/ghc-stage2" -hisuf dyn_hi -osuf dyn_o -hcsuf dyn_hc -fPIC -dynamic -O0 -H64m -Wall -hide-all-packages -package-env - -i -iutils/check-api-annotations/. -iutils/check-api-annotations/dist-install/build -Iutils/check-api-annotations/dist-install/build -iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -Iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -optP-include -optPutils/check-api-annotations/dist-install/build/check-api-annotations/autogen/cabal_macros.h -package-id Cabal-3.2.1.0 -package-id base-4.14.3.0 -package-id containers-0.6.5.1 -package-id directory-1.3.6.0 -package-id ghc-8.10.7.20240224 -Wall -XHaskell2010 -no-user-package-db -rtsopts -Wnoncanonical-monad-instances -outputdir utils/check-api-annotations/dist-install/build -c utils/check-api-annotations/./Main.hs -o utils/check-api-annotations/dist-install/build/Main.dyn_o utils/check-api-annotations/ghc.mk:18: recipe for target 'utils/check-api-annotations/dist-install/build/Main.dyn_o' failed make[1]: *** [utils/check-api-annotations/dist-install/build/Main.dyn_o] Segmentation fault (core dumped) Makefile:123: recipe for target 'all' failed make: *** [all] Error 2 ```
Is there any other place I've missed follow-up modifications?
I appreciate any help provided.
Best, Adithya _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Hello Adithya, This sounds just like what has been implemented as the default mode for eras profiling: https://well-typed.com/blog/2024/01/ghc-eras-profiling — which tracks an “era” for each heap object — and, by default, uses a major garbage collection as the increment trigger. Could you check it out and see if it would supersede what you are trying to do? Cheers, Rodrigo
On 25 Feb 2024, at 12:58, Adithya Kumar
wrote: Hello,
I want to add a field for collecting information about the number of GCs a particular heap object survived.
I've done the following to implement this: - Add a field "StgWord gc_id" to struct "StgHeader" and "StgThunkHeader" - Update "SET_HDR" macro in "ClosureMacros.h" to update the "gc_id" - Update the "closureTypeHeaderSize" function in "Heap/ClosureTypes.hs" to account for that 1 extra word.
Compilation leads to a segmentation fault. The stage 2 compiler is built. But usage of it leads to a segmentation fault.
Build output: ``` chmod +x inplace/bin/ghc-stage2 "inplace/bin/ghc-stage2" -hisuf dyn_hi -osuf dyn_o -hcsuf dyn_hc -fPIC -dynamic -O0 -H64m -Wall -hide-all-packages -package-env - -i -iutils/check-api-annotations/. -iutils/check-api-annotations/dist-install/build -Iutils/check-api-annotations/dist-install/build -iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -Iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -optP-include -optPutils/check-api-annotations/dist-install/build/check-api-annotations/autogen/cabal_macros.h -package-id Cabal-3.2.1.0 -package-id base-4.14.3.0 -package-id containers-0.6.5.1 -package-id directory-1.3.6.0 -package-id ghc-8.10.7.20240224 -Wall -XHaskell2010 -no-user-package-db -rtsopts -Wnoncanonical-monad-instances -outputdir utils/check-api-annotations/dist-install/build -c utils/check-api-annotations/./Main.hs -o utils/check-api-annotations/dist-install/build/Main.dyn_o utils/check-api-annotations/ghc.mk:18 http://ghc.mk:18/: recipe for target 'utils/check-api-annotations/dist-install/build/Main.dyn_o' failed make[1]: *** [utils/check-api-annotations/dist-install/build/Main.dyn_o] Segmentation fault (core dumped) Makefile:123: recipe for target 'all' failed make: *** [all] Error 2 ```
Is there any other place I've missed follow-up modifications?
I appreciate any help provided.
Best, Adithya _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Hello, Appreciate the swift responses. I need this feature in GHC 8.10.7. This, I believe is only available post 9.10. I can try replicating the same kind of behavior in GHC 8.10.7. Some more context to the problem at hand: The overhead of the profiling I want to enable should be as minimal as possible as we plan to run this build in production. The memory leak I'm trying to debug happens over a few days after over a million requests and we aren't able to replicate it offline. I can take inspiration from the work done in 9.10 and replicate it in 8.10.7 in a way that it can be used without other features of profiling. This is what I was trying to do. Ie. Add a new field "era" in the "StgHeader" instead of "StgProfHeader". Making the follow-up changes was the problem as I might've missed the bookkeeping in a few places. But now I can look at 9.10. So I have a baseline to compare with. I will try this, and get back to this thread. Best, Adithya On Sun, Feb 25, 2024 at 9:33 PM Rodrigo Mesquita < rodrigo.m.mesquita@gmail.com> wrote:
Hello Adithya,
This sounds just like what has been implemented as the default mode for eras profiling: https://well-typed.com/blog/2024/01/ghc-eras-profiling — which tracks an “era” for each heap object — and, by default, uses a major garbage collection as the increment trigger. Could you check it out and see if it would supersede what you are trying to do?
Cheers, Rodrigo
On 25 Feb 2024, at 12:58, Adithya Kumar
wrote: Hello,
I want to add a field for collecting information about the number of GCs a particular heap object survived.
I've done the following to implement this: - Add a field "StgWord gc_id" to struct "StgHeader" and "StgThunkHeader" - Update "SET_HDR" macro in "ClosureMacros.h" to update the "gc_id" - Update the "closureTypeHeaderSize" function in "Heap/ClosureTypes.hs" to account for that 1 extra word.
Compilation leads to a segmentation fault. The stage 2 compiler is built. But usage of it leads to a segmentation fault.
Build output: ``` chmod +x inplace/bin/ghc-stage2 "inplace/bin/ghc-stage2" -hisuf dyn_hi -osuf dyn_o -hcsuf dyn_hc -fPIC -dynamic -O0 -H64m -Wall -hide-all-packages -package-env - -i -iutils/check-api-annotations/. -iutils/check-api-annotations/dist-install/build -Iutils/check-api-annotations/dist-install/build -iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -Iutils/check-api-annotations/dist-install/build/check-api-annotations/autogen -optP-include -optPutils/check-api-annotations/dist-install/build/check-api-annotations/autogen/cabal_macros.h -package-id Cabal-3.2.1.0 -package-id base-4.14.3.0 -package-id containers-0.6.5.1 -package-id directory-1.3.6.0 -package-id ghc-8.10.7.20240224 -Wall -XHaskell2010 -no-user-package-db -rtsopts -Wnoncanonical-monad-instances -outputdir utils/check-api-annotations/dist-install/build -c utils/check-api-annotations/./Main.hs -o utils/check-api-annotations/dist-install/build/Main.dyn_o utils/check-api-annotations/ghc.mk:18: recipe for target 'utils/check-api-annotations/dist-install/build/Main.dyn_o' failed make[1]: *** [utils/check-api-annotations/dist-install/build/Main.dyn_o] Segmentation fault (core dumped) Makefile:123: recipe for target 'all' failed make: *** [all] Error 2 ```
Is there any other place I've missed follow-up modifications?
I appreciate any help provided.
Best, Adithya _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
participants (4)
-
Adithya Kumar
-
Csaba Hruska
-
Matthew Pickering
-
Rodrigo Mesquita